[JSOI2007] 奶酪 题解 贪心 O(1)

来源:互联网 发布:自动化设备控制软件 编辑:程序博客网 时间:2024/05/10 15:05
PID227 / [JSOI2007]奶酪
  • 提交你的代码
  • 查看讨论和题解
我的状态
查看最后一次评测记录
   
题目描述

奶酪和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
原创粉丝点击