题目描述
奶酪和pizza一样,是一小块扇形的固体。在奶酪从工厂里生产出来的时候,一共有4种形状,编号为1~4,分别是圆心角为72º;;,144º;;,216º;;,288º;;的扇形。奶酪的盒子是圆形的,半径和奶酪的半径一致。也就是说,一块1号奶酪和一块4号奶酪可以恰好装入一个盒子,一块2号奶酪和一块3号奶酪可以恰好装入一个盒子。
你的任务是写一个程序,计算给定的奶酪最多可以装满几个盒子。
输入格式
一行,四个数字,表示1~4号奶酪的数量,都在0~100之内
输出格式
一个数字,表示可以装满几个盒子
样例输入
2 1 1 1
样例输出
2
解题思路:
利用给定的1~4号的奶酪数量,拼成最多的整个奶酪。这道题不仔细看题目的话会认为只有两种拼接方式,我就在这里错了很多次。这道题一共有六种拼接方式。那么为了使能拼成的整个奶酪尽可能多,就要有一定的拼接顺序。这题使用贪心算法就可以。贪心策略是优先使用最少的数目组合去去拼接整块奶酪。然后完成一种拼接判断是否能使用下一种方式。
拼接方法和使用的数目如下(按优先级排列):
(1)72×1和288×1 总数为2
(2)144×1和216×1 总数为2
(3)72×2和216×1 总数为3
(4)72×1和144×2 总数为3
(5)72×3和144×1 总数为4
(6)72×5 总数为5
AC代码:
#include<iostream>
usingnamespace std;
intdata[5];
inttotal=0;
intx1=0;
intx2=0;
intx3=0;
intx4=0;
intx5=0;
intx6=0;
intMin(int a,int b)
{
if(a<b)
return a;
return b;
}
intmain()
{
for(int i=1;i<5;++i)
cin>>data[i];
x1=Min(data[1],data[4]); //1和4
x2=Min(data[2],data[3]); //2和3
int margin[5];
margin[1]=data[1]-x1;
margin[4]=data[4]-x1;
margin[2]=data[2]-x2;
margin[3]=data[3]-x2;
if(margin[1]>=2&&margin[3]>=1)
{
x3=Min(margin[1]/2,margin[3]);//1和3组合 1:72*2 3:216 3
margin[1]-=x3*2; //更新
margin[3]-=x3;
}
if(margin[1]>=1&&margin[2]>=2)
{
x4=Min(margin[1],margin[2]/2); //1和2组合 1:72 2:2*144 3
margin[1]-=x4; //更新
margin[2]-=x4*2;
}
if(margin[1]>=3&&margin[2]>=1)
{
x5=Min(margin[1]/3,margin[2]); //1和2组合 1:72*3 2: 1*144 4
margin[1]-=x5*3; //更新
margin[2]-=x5;
}
if(margin[1]>=5)
x6=margin[1]/5; //只用1(5个1) 5
cout<<x1+x2+x3+x4+x5+x6<<endl;
return 0;
}