愿各位程序员都能记住,输出第一条hello world时候的心情。坚持下去,你的每一条代码都在默默的改变世界,加油!加油!加油! “这些年我一直提醒自己一件事情,千万不要自己感动自己。大部分人看似的努力,不过是愚蠢导致的。 什么熬夜看书到天亮,连续几天只睡几小时,多久没放假了,如果这些东西也值得夸耀,那么富士康流水线上任何一个人都比你努力多了。 人难免天生有自怜的情绪,唯有时刻保持清醒,才能看清真正的价值在哪里。

比赛排名 【组合数】

 

本人水平有限,题解不到为处,请多多谅解

 

本蒟蒻谢谢大家观看

 

 

题目:

比赛排名

(rank.cpp/in/out 1s 128M)

N个同学参加比赛,问有多少种排名情况,允许出现并列的情况

Input

输入一个数字NN<=12

Output

输出有多少种排名情况

Sample Input

2

Sample Output

3

HINT

设两名同学为A,B,则排名情况有以下三种

1:A第一名,B第二名

2:A第二名,B第一名

3:A,B并列第一名

 

f(i)表示i个同学参加比赛,问有多少种排名情况,允许出现并列的情况

 

 

可以考虑下第一名的几个人,可以有一个人,则结果为c(n,1)*f(n-1) 因为已经取走1人

 

可以有2个人,则结果为c(n,2)*f(n-2)  因为已经取走2人

 

可以有3个人,则结果为c(n,3)*f(n-3)  因为已经取走3人

 

……

 

可以有n个人,则结果为c(n,n)*f(0)   取走n人

 

ans等于以上情况进行相加

 

code:

 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 long long a[210];
 4 long long C(long long m,long long n)//C (m中取n) 
 5 {
 6     long long ans=1;
 7     for(long long i=1;i<=n;i++)
 8     ans=ans*(m-i+1)/i;
 9     return ans;
10 }
11 signed main()
12 {
13     long long n,t;
14     scanf("%lld",&n);
15     a[1]=a[0]=1;
16     for(long long k=2;k<=n;k++)
17     {
18         for(long long i=1;i<=k;i++)
19         {
20             a[k]+=a[k-i]*C(k,i);
21         }
22     }
23     printf("%lld\n",a[n]);
24     return 0;
25 }

 

posted @ 2019-10-21 15:55  max_lemon  阅读(304)  评论(0编辑  收藏  举报
Live2D
别人恋爱不成功,你连暗恋都不成功! 你写不出代码的原因只有一个,那就是你没有彻底理解这个算法的思想!!-----沃茨·基硕德