Codeforces 478B 6thweek contest_B

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
",Min,Max);
26 return 0;
27 
28 }
View Code


 

原文地址:https://www.cnblogs.com/x512149882/p/4750662.html