JSOI2007奶酪題解

題目描述

奶酪和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;

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章