Codeforces 478C Table Decorations 贪心(思维!!!)

点击打开链接

题意:给出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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值