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