Codeforces Round #273 (Div. 2)

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;
}

B:

#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;
}

C:

#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;
}


你可能感兴趣的:(Codeforces Round #273 (Div. 2))