A - Initial Bet,就是判断五个值相加的和是否是5的倍数,其中要注意的就是,如果都是0的时候应输出-1;
B - Random Teams,题目的意思容易理解,那么如果人数最多则必有一个队的人数为n-m+1,人数最少时则是有n%m个队伍的人数为n/m+1,有m-n%m个队伍为n/m个人,从而即可得到程序
C - Table Decorations,一个关于贪心的题目,自己的理解能力比较差,是研究别人的代码之后得到答案的,首先如果我们只有两种颜色的气球,我们应尽可能的用<1a,2b>
这种方式进行,当a==b时,我们则采用<3a> <3b>这种方式进行消除,知道a b小余3时,就OK了,从而我们推广到3种颜色的气球时用同样的方法。
A:
#include<string.h> #include<stdio.h> #include<stdlib.h> #include<algorithm> using namespace std; char s[10009],ss[5]; int main() { int a,b,c,d,e; scanf("%d%d%d%d%d",&a,&b,&c,&d,&e); if((a+b+c+d+e)%5==0&&a+b+c+d+e!=0) printf("%d\n",(a+b+c+d+e)/5); else printf("-1\n"); return 0; }
#include <iostream> #include <cstdio> using namespace std; int main() { long long n,m,x,y,min,max; scanf("%I64d %I64d",&n,&m); x=n%m; y=n/m; min=(2*x*y+y*y*m-y*m)/2; max=(n-m)*(n-m+1)/2; printf("%I64d %I64d\n",min,max); return 0; }
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; int main() { int s[9]; for(int i=0;i<3;i++) scanf("%d",&s[i]); sort(s,s+3); int k1=min(s[0],(s[2]-s[1])/2);//用<1a,2c>消耗过多的c s[0]-=k1; s[2]-=k1*2; int k2=s[0];//把a消完 s[0]-=k2; s[1]-=k2; s[2]-=k2; int k3=min(s[1],(s[2]-s[1]));//消耗过多的c,使用<1b,2c>组合 s[1]-=k3; s[2]-=k3*2; int k4=s[1]/3*2;//消耗a,b直至a和b的个数小余3 s[1]-=k4/2*3; s[2]-=k4/2*3; int k5; if((s[1]==1&&s[2]>=2)||s[1]==2)//判断最后的a,b能否组成一组 { k5=1; } else { k5=0; } int sum=k1+k2+k3+k4+k5; printf("%d\n",sum); return 0; }