码迷,mamicode.com
首页 > 其他好文 > 详细

[UVA - 12034] Race 题解

时间:2017-09-25 09:44:08      阅读:96      评论:0      收藏:0      [点我收藏+]

标签:class   algorithm   入门   .net   输出   std   code   log   init   

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

 题目链接(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 题解

标签:class   algorithm   入门   .net   输出   std   code   log   init   

原文地址:http://www.cnblogs.com/shingen/p/7590247.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!