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