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 }
补------------------------------------------
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 }
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 }
D是dp= =