题意:给出r,g,b三种颜色<=1e9,一张table不能由同一种颜色合成,问最多能合成多少张table?
贪心:每次从数量大的颜色拿2,数量小的颜色拿1作为一张table
当(a[0]+a[1])*2<=a[2]时,贪心 最多只能拿a[0]+a[1]次
显然ans<=sum/3的,当(a[0]+a[1])*2>a[2]时,能否构造出ans张table? 或者说剩下的table为sum%3张?
构造:最多sum/3张table && a[2]<2*(a[0]+a[1])时总能取到
2*(a[0]+a[1])>a[2]时 先贪心拿,直到a[2] 与 max(a[0],a[1]) 差值最多2时 .i.e max=3 1<=sec_max<=3
即设变量dif=max(a[0],a[1],a[2]) - sec_max(a[0],a[1],a[2]) <=2
此时可以发现 如果a[0]存在则可以采取(RGB) 等式dif不变直到-> (0,a[1],a[2])
此时继续贪心发现终止条件为 max=2&&sec_=0||max=<2 i.e(0,0,2),(0,1,1) 即最后总能剩下sum%3个
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e2+20;
ll a[N];
int main()
{
while(cin>>a[0]>>a[1]>>a[2])
{
sort(a,a+3);
ll sum=a[0]+a[1]+a[2];
ll ans;
if((a[0]+a[1])*2<=a[2])
{
//贪心:每次从数量大的颜色拿2,数量小的颜色拿1作为一张table
ans=a[0]+a[1];//拿到只剩一种颜色
}
else
{
//最多sum/3张table && a[2]<2*(a[0]+a[1])时总能取到
ans=sum/3;
}
cout<<ans<<endl;
}
return 0;
}