Problem - 478C - Codeforces
解析:
做法一:二分,显然左右边界为 0 和 总数量除以3。check时mid,任意两项之和都不能小于mid
做法二:贪心,当数量最大的气球数量的一半小于另外两种颜色气球的数量之和,可以组成全部颜色数量之和的三分之一。否则全部组成都是 2:1 的方案。
二分代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
int a,b,c;
bool check(int mid){
if(a+b<mid||a+c<mid||b+c<mid) return false;
return true;
}
signed main(){
scanf("%lld%lld%lld",&a,&b,&c);
int l=0,r=(a+b+c)/3;
while(l<r){
int mid=l+r+1>>1;
if(check(mid)) l=mid;
else r=mid-1;
}
cout<<l;
return 0;
}
贪心代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
int r,g,b;
signed main(){
scanf("%lld%lld%lld",&r,&g,&b);
cout<<min(r+g,min(g+b,min(r+b,(r+g+b)/3)));
return 0;
}