[UVA - 12034] Race 题解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[UVA - 12034] Race 题解相关的知识,希望对你有一定的参考价值。

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置。

 题目链接(vjudge):https://vjudge.net/problem/UVA-12034

题目大意:

A,B两人赛跑,可能出现三种情况:

1、A,B并列第一  2、A第一,B第二  3、B第一,A第二

现在有N个人赛跑,问可能出现多少种情况,答案对10056取模。

输入格式:

第一行一个数字T(1<=T<=1000),表示数据组数。

接下来T行,每行一个数字N(1<=N<=1000),表示赛跑的人数。

输出格式:

对于每个询问,输出当前的问题序号和答案。

Sample Input

3

1

2

3

Sample Output

Case 1: 1

Case 2: 3

Case 3: 13

 

分析:

递推。假设有n个人参加赛跑,其中x个人并列第一,那么情况数=C(n,x)*f(n-x)

枚举x计算出所有的情况,加和即可。

刘汝佳《算法竞赛入门经典》

 

AC代码:

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cmath>
 4 #include<cstring>
 5 
 6 const int MOD = 10056;
 7 
 8 inline void read(int &x)
 9 {
10     char ch = getchar(),c = ch;x = 0;
11     while(ch < 0 || ch > 9) c = ch,ch = getchar();
12     while(ch <= 9 && ch >= 0) x = (x<<1)+(x<<3)+ch-0,ch = getchar();
13     if(c == -) x = -x;
14 }
15 
16 int f[1005],c[1005][1005];
17 
18 inline void init()
19 {
20     int n = 1000;
21     
22     for(int i = 0;i <= n;++ i)
23     {//组合公式 
24         c[i][0] = 1,c[i][i] = 1;
25         for(int j = 1;j < i;++ j)
26             c[i][j] = (c[i-1][j]+c[i-1][j-1])%MOD;
27     }
28     f[0] = 1;
29     for(int i = 1;i <= n;++ i)
30     {//i为参加比赛的总人数,j为第x名的人数 
31         for(int j = 1;j <= i;++ j)
32             f[i] = (f[i]+(c[i][j]*f[i-j])%MOD)%MOD;
33     }
34 }
35 
36 int main()
37 {
38     int t,n;
39     init();
40     read(t);
41     for(int T = 1;T <= t;++ T)
42     {
43         read(n);
44         printf("Case %d: %d\n",T,f[n]);
45     }
46     return 0;
47 }

 

以上是关于[UVA - 12034] Race 题解的主要内容,如果未能解决你的问题,请参考以下文章

UVa 12034 Race (递推+组合数学)

UVA 12034 Race (递推神马的)

uva 12034 Race

UVA12034比赛名次

UVa 12034 比赛名次(递推)

UVA 12034(递推&递归_I题)解题报告