C. Table Decorations

http://codeforces.com/contest/478/problem/C

题目大意:分别给出红色,绿色和蓝色的球的个数,问可以分成多少份,使得每份里面没有三个都相同的球。

方法: 首先一定可以分成三种球当中个数最小的份数,每一份都是由三种颜色组成的,那么剩下的两种颜色会分别剩下pp, qq个球,假设pp > qq,

            假设pp个a颜色的, qq个b颜色的, 我们可以知道,剩下的球可以分成min((pp+qq)/3, qq)种, (pp+qq)/3是不变的, 那就是说,qq 比较大的话,

            会比较好,这个时候可以将已经分配好的里面的b颜色换成a颜色,这样的话,本来的不影响,现在的也可以变多,在变化的时候,依然要保证qq >= pp。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int main(){
    __int64 r, g, b;
    while(scanf("%I64d%I64d%I64d", &r, &g, &b) == 3){
        __int64 res = min(r, min(g, b));
        __int64 pp, qq;
        if(res == r){
            pp = g - res;
            qq = b - res;
        }
        else if(res == g){
            pp = r - res;
            qq = b - res;
        }
        else{
            pp = r - res;
            qq = g - res;
        }
        __int64 temp = (pp+qq) / 2;
        __int64 mm = min(pp, qq);
        if(mm+res <= temp){
            res += min((pp+qq)/3, mm+res);
        }
        else
            res += min((pp+qq)/3, temp);
        printf("%I64d\n", res);
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值