题目描述
奶酪和pizza一样,是一小块扇形的固体。在奶酪从工厂里生产出来的时候,一共有4种形状,编号为1~4,分别是圆心角为72º,144º,216º,288º的扇形。奶酪的盒子是圆形的,半径和奶酪的半径一致。也就是说,一块1号奶酪和一块4号奶酪可以恰好装入一个盒子,一块2号奶酪和一块3号奶酪可以恰好装入一个盒子。你的任务是写一个程序,计算给定的奶酪最多可以装满几个盒子。
1~4号奶酪的数量,都在0~100之内
贪心
由于每步都采用同样的、简单的策略,无论从代码的实现上,还是从时间复杂度上看,都是相当好的选择。
贪心算法如果设计的到位,可以保证在几乎所有情况得到正解答案。
进一步地,当局部最优解可以推出全局最优解时,贪心就是正解答案。
四种奶酪分别为:72º、144º、216º、288º 。
首先考虑可以组合的方法有以下几种:
4+1、3+2、3+1+1、2+2+1、2+1X3、1X5
那么究竟应该先用哪种方案?如果采用类似NOIP乌龟棋的动规,很大可能是会超时。采用搜索似乎效率更低
采取贪心算法:优先选择角度大的奶酪进行组合。
分析:若先使用小的奶酪,则需要大量的小号奶酪,使得之后与大号的匹配时数量不足。
贪心未必要严谨,在实际情况中可以不用数学语言来证明。
它所拥有的简洁性和自由度是其它算法所不能达到的。
若要证明贪心的正确性,需要证明局部全优可以造成全局最优。
贪心老公式:能放就放,大的顺序在前。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<cstdlib>
using namespace std;
int main()
{
int a,b,c,d,ans=0;
scanf("%d%d%d%d",&a,&b,&c,&d);
if(d>a)
ans=ans+a,a=0;
else
ans=ans+d,d=0;
if(c>b)
ans=ans+b,b=0;
else
ans=ans+c,c=0;
while(b>=2&&a>=1)
ans++,b=b-2,a--;
while(a>=2&&c>0)
ans++,c--,a=a-2;
while(a>=3&&b>0)
ans++,b--,a=a-3;
printf("%d\n",ans+a/5);
return 0;
}