Codeforces Round #273 (Div. 2) C.Table Decorations 贪心
2015-07-14 15:19
239 查看
思路:每个桌子的三个气球只有两种情况:1 + 1 + 1或者 2 + 1
使用贪心的策略,每次使用2 + 1的放法。
先将三种气球按数量排序,不失一般性,令r, g, b的数目有
所以基本放法是:bb + (r / g)。所以按照2 +1的策略放,到最后有两种情况:①r和g无剩余;②r,g有剩余;
① r和g无剩余
,此时只有b剩余,不能装饰新的桌子,故解为
② r,g有剩余
,此时r和g有剩余(b也可能有剩余,需要考虑)
则首先根据2 + 1的原则,用bb + (r/g)来放置,直到b小于2,剩余的r和g也按照2 + 1放置。
下面证明两种颜色的球至多可以装饰
张桌子。
令r球有a个,g球有b个,有x张桌子为rrb,y张桌子为bbr,则:
得
1)b球无剩余,则令
,解为
2)b球剩余1个
i. 若
。则最后还剩余两个r/g,可以与b再装饰一个桌子,解为:
ii. 若
,则r、g球刚好装饰整数张桌子,没有多余,解为:
iii. 若
,则最后余下1个r或g,解为:
综上:
时,最优解为
AC代码如下:
使用贪心的策略,每次使用2 + 1的放法。
先将三种气球按数量排序,不失一般性,令r, g, b的数目有
所以基本放法是:bb + (r / g)。所以按照2 +1的策略放,到最后有两种情况:①r和g无剩余;②r,g有剩余;
① r和g无剩余
,此时只有b剩余,不能装饰新的桌子,故解为
② r,g有剩余
,此时r和g有剩余(b也可能有剩余,需要考虑)
则首先根据2 + 1的原则,用bb + (r/g)来放置,直到b小于2,剩余的r和g也按照2 + 1放置。
下面证明两种颜色的球至多可以装饰
张桌子。
令r球有a个,g球有b个,有x张桌子为rrb,y张桌子为bbr,则:
得
1)b球无剩余,则令
,解为
2)b球剩余1个
i. 若
。则最后还剩余两个r/g,可以与b再装饰一个桌子,解为:
ii. 若
,则r、g球刚好装饰整数张桌子,没有多余,解为:
iii. 若
,则最后余下1个r或g,解为:
综上:
时,最优解为
AC代码如下:
#include <cstdio> #include <algorithm> using namespace std; long long a[3]; int main(){ long long sum = 0; for(int i = 0; i < 3; i ++) scanf("%I64d", &a[i]), sum += a[i]; sort(a, a + 3); if(a[0] + a[1] <= a[2] / 2) printf("%I64d\n", sum - a[2]); else printf("%I64d\n", sum / 3); return 0; }
相关文章推荐
- 动画类型
- 一些思考 以及胡乱写的韵脚
- vcruntime140.dll丢失问题处理
- Js 学习资料
- 动画类型 分类: Android 2015-07-14 15:19 8人阅读 评论(0) 收藏
- Variant
- SNMP监控一些常用OID的总结
- SpringMVC实战(注解)
- Scala快速排序算法解析
- Markdown Pad 2 注册码
- OSGI Buleprint(7)
- C# 类中索引器的使用
- Linux 系统实现源地址路由
- 新的Blog
- Project Euler:Problem 62 Cubic permutations
- 动画
- Android 断开电源10秒后自动关机
- Excel导入功能(Ajaxfileupload)
- hadoop之MapReduce调用R的一次失败的总结~
- "世界很美好,值得你为之奋斗。" 我只同意后半句 --- 海明威