Codeforces Round #273 (Div. 2)

A. Initial Bet

题意:给出5个数,判断它们的和是否为5的倍数,注意和为0的情况

 1 #include<iostream>  
 2 #include<cstdio>  
 3 #include<cstring> 
 4 #include <cmath>   
 5 #include<algorithm>  
 6 using namespace std;
 7 
 8 typedef long long LL;
 9 
10 
11 int main()
12 {
13     int i,x,sum=0;
14     for(i=1;i<=5;i++){
15         cin>>x;
16         sum+=x;
17     }
18     if(sum%5==0&&sum!=0) printf("%d
",sum/5);
19     else printf("-1
");
20     return 0;    
21 }
View Code

补------------------------------------------

B. Random Teams

题意:给出n个人,需要分成m个组,称分到同一组里的任意两个人为一队 求最小的对数,最大的对数。

首先好考虑的是最大对数,让人尽量集中在一起, 即为前m-1组全为1个人,最后一组为n-(m-1)个人

然后是最小的对数,与最大相反,应该让人数尽量分散,即为先每一组分n/m个人,在将余数依次添加到n%m个组上

比如10个人,6组

yushu=10%6=4

ans=10/6=1

1 1 1 1 1 1

依次添加余数

2 2 2 2 1 1

即为有yushu个组是人数为ans+1,(m-yushu)个组是ans个人

 1 #include<iostream>  
 2 #include<cstdio>  
 3 #include<cstring> 
 4 #include <cmath>   
 5 #include<algorithm>  
 6 using namespace std;
 7 
 8 typedef long long LL;
 9 
10 
11 int main()
12 {
13     LL mx,mn=0,m,n;
14     cin>>n>>m;
15     LL d=n%m;
16     LL ans=n/m;
17     mx=(n-(m-1))*(n-(m-1)-1)/2;
18     mn=(d*(ans+1)*ans)/2+(m-d)*ans*(ans-1)/2;
19     cout<<mn<<' '<<mx<<"
";    
20     return 0;    
21 }
View Code

C. Table Decorations

题意:给出三种颜色的气球个数a,b,c,一张桌子不能全是一种颜色的气球,问最多可以装饰多少个桌子

这道题目是看题解都看得好艰难= =

假设a<b<c,最多可以装饰ans张桌子

结论是:当c>=2*(a+b) ans=a+b      

           当c<2*(a+b)  ans=(a+b+c)/3

当c>=2*(a+b)的时候好证明:即为每次从c中取2,从(a,b)里面任选一个,因为c是大于等于2*(a+b)的,对于任意从(a,b)里面任意选出来的一个,都能从c里面取出2 即只需考虑a+b,所以为a+b

第二种情况= =还木有看懂

 1 #include<iostream>  
 2 #include<cstdio>  
 3 #include<cstring> 
 4 #include <cmath>   
 5 #include<algorithm>  
 6 using namespace std;
 7 
 8 typedef long long LL;
 9 LL a[5];
10 
11 int main()
12 {
13     int ans=0;
14     while(cin>>a[1]>>a[2]>>a[3]){
15         sort(a+1,a+3+1);
16         if(a[3]>=2*(a[1]+a[2])) cout<<a[1]+a[2]<<endl;
17         else cout<<(a[1]+a[2]+a[3])/3<<endl;
18     }
19     return 0;
20 }
View Code

D是dp= =

原文地址:https://www.cnblogs.com/wuyuewoniu/p/4322600.html