Random teams
题意:
有n个选手和m个队伍,让你分配,条件是每个队伍至少要有1个选手。分配完之后,每队伍里2个人可以组成一组,求分配完之后最多的组数和最少的组数
分析:
1. 最多的情况就是,先每个队伍分一个人,然后把剩下的全部给到一个队伍里,就是最多的情况 例如:n=10,m=3 1 1 8
2、 最少的情况就是,每队分n/m个人,然后剩下的再均分给每队。 例如: 3 3 3+1
代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<string> 5 using namespace std; 6 //const int maxn=1000000000; 7 //long long a[maxn][maxn]; 8 9 int main() 10 { 11 long long n,m,Min,Max,ave,yu; 12 scanf("%lld%lld",&n,&m); 13 ave=n/m; //平均分给每队的人数 14 yu=n%m; //余数 15 if(yu==0) 16 { 17 Min=m*(ave*(ave-1))/2;//恰好均分给m个队的时候最小个数=m*(ave个人中选2个人的组合) 18 Max=(n-m+1)*(n-m)/2; //最多个数max=(n-m+1个人选2个人的组合数) 19 } 20 else 21 { 22 Min=(m-yu)*(ave*(ave-1))/2+yu*((ave+1)*ave)/2; 23 Max=0+(n-m+1)*(n-m)/2; 24 } 25 printf("%I64d %I64d\n",Min,Max); 26 return 0; 27 28 }