[JSOI2007] 奶酪 题解 贪心 O(1)
来源:互联网 发布:自动化设备控制软件 编辑:程序博客网 时间:2024/05/10 15:05
题目描述
奶酪和pizza一样,是一小块扇形的固体。在奶酪从工厂里生产出来的时候,一共有4种形状,编号为1~4,分别是圆心角为72º;;,144º;;,216º;;,288º;;的扇形。奶酪的盒子是圆形的,半径和奶酪的半径一致。也就是说,一块1号奶酪和一块4号奶酪可以恰好装入一个盒子,一块2号奶酪和一块3号奶酪可以恰好装入一个盒子。
你的任务是写一个程序,计算给定的奶酪最多可以装满几个盒子。
输入格式
一行,四个数字,表示1~4号奶酪的数量,都在0~100之内
输出格式
一个数字,表示可以装满几个盒子
样例输入
样例输出
原题地址:http://www.rqnoj.cn/problem/227
题解:
我们先将题目稍变一下:有a,b,c,d个体积为1,2,3,4的物体,问能装满多少个体积为5的箱子
然后我们不难列出所有能凑的式子:
5*1 3*1+1*2 1*1+2*2 2*1+1*3 1*2+1*3 1*1+1*4 (乘号前为数量,乘号后为体积)
我们发现1个箱子中最多只能装下1个4,那我们不妨先将4装入d个箱子中
我们又发现1个箱子中最多只能装下1个3,,并且不能和4放在一块,那不妨再将3放入c个箱子中
现在4和3的价值已经被榨干了,不管它们了(贪心)
然后我们考虑已经装了4的箱子是否要装个1将之填满呢?
答案是肯定的,因为“对于1而言”已经没有更划算的买卖了(贪心):只要消耗1个1,而且不用消耗2,就能得到1个满箱子
我们再考虑已经装了1个3的箱子,有2个问题?是装它还是装空箱子?如果装的话,装2个1还是装1个2?
装空箱子猜猜就是不划算的,而且无论使用“5*1 3*1+1*2 1*1+2*2”中的哪一个式子,都有办法用它们中的一部分凑到3体积,
也就是说,用1、2来装满5体积的话,相当于先装了3体积,再装剩下的2体积。那我还不如直接用已经装了3体积的那些箱子,少耗资源多好啊(贪心)。
那下一个问题,装2个1还是装1个2?
当然是装1个2了,因为1个2能做的事,2个1都能做,反之则不一定,因为我可以把2个1拆开用。既然如此,让没用的2上吧(贪心)。
小结一下,以上也就是先将1、4尽可能组合,2、3尽可能组合。
如果2没有了,而那些已经装了3的盒子还有并且还有1,就用2个1来装。
现在那些装了1个4或1个3的箱子已经处理完了,我们来处理手头剩下的1和2(如果有的话)。
还是老样子,2没有用,让它先上,先用2个2,1个1装,2不够了就用1个2,3个1装,还不够就用5个1装。
现在1、2、3、4都被榨干了,剩下的也都凑不了5了~
注意: a-=b/2; b%=2; 顺序不能换呀...
代码仅供参考:
#include<iostream>using namespace std;int main(){int a,b,c,d;cin>>a>>b>>c>>d;int sum=0;if (a>=d){sum+=d;a-=d;d-=d;}else {sum+=a;d-=a;a-=a;}if (b>=c){sum+=c;b-=c;c-=c;if (a>=b/2){sum+=b/2;a-=b/2;b%=2;if (b==1&&a>=3){sum+=1;b-=1;a-=3;}sum+=a/5;a%=5;}else{sum+=a;b-=2*a;a-=a;}}else{sum+=b;c-=b;b-=b;if (a>=2*c){sum+=c;a-=2*c;c-=c;}else{sum+=a/2;c-=a/2;a%=2;}sum+=a/5;a%=5;}cout<<sum<<endl;return 0;}
0 0
- [JSOI2007] 奶酪 题解 贪心 O(1)
- JSOI2007奶酪题解
- 【贪心】【RQNOJ】[JSOI2007]奶酪
- 【贪心】[JSOI2007]奶酪
- 【贪心+堆】BZOJ1029(JSOI2007)[建筑抢修]题解
- 老鼠偷奶酪 题解
- JSOI2007 麻将 题解
- 模拟+贪心 [JSOI2007]麻将
- 【JSOI2007】建筑抢修 贪心+堆
- [BZOJ1028][JSOI2007]麻将(贪心)
- NOIP2017提高组day2T1题解(奶酪)
- 【贪心】17.6.1 漂流 题解
- 奶酪
- 奶酪
- bzoj 1029 [JSOI2007] 建筑抢修 题解
- BZOJ1030 JSOI2007 文本生成器 题解&代码
- [BZOJ1029][JSOI2007][贪心][堆]建筑抢修
- BZOJ 1029 JSOI2007 建筑抢修 贪心+堆
- The C10K problem翻译
- 等高布局
- python面试题大全
- 获取CPU序列号、网卡MAC地址、硬盘序列号
- 浅谈C++多态性
- [JSOI2007] 奶酪 题解 贪心 O(1)
- 线程条件变量pthread_cond_t
- 找素数
- 动态设置layout高度
- js寄生函数
- 归并排序
- 字符数组封装实现添加,删除,插入,修改,搜索,打印
- PAT 1048. Find Coins (25) 超简便做法!!!
- MySQL基本知识