JSOI2007乳酪題解

2021-07-12 07:47:40 字數 1908 閱讀 8349

題目描述

乳酪和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

usingnamespace std;

intdata[5];

inttotal=0;

intx1=0;

intx2=0;

intx3=0;

intx4=0;

intx5=0;

intx6=0;

intmin(int a,int b)

if(areturn 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

JSOI2007 乳酪 題解 貪心 O 1

pid227 jsoi2007 乳酪 檢視最後一次評測記錄 題目評價 質量 4 0 16.6 16.6 16.6 50 通過統計 最短耗時 0ms 最小記憶體 0kb 題目標籤 型別 貪心模擬 jsoi2007 題目描述 乳酪和pizza一樣,是一小塊扇形的固體。在乳酪從工廠裡生產出來的時候,一共有...

題解 JSOI2007 建築搶修

貪心加優先佇列 先對每個建築物的t值從小到大進行排序 當某個建築物無法按時完成時 在已經選擇的建築物裡選擇比這個建築物用時長的替換下來,並且放棄這個建築物 1 include2 include3 include4 include5 using namespace std 6int n,ans,now...

JSOI2007 建築搶修

提交傳送門 這個就是乙個貪心唄,用set維護大到小的數列 然後如果能搶修乙個建築的話就ans 不能的話,看看比不比上一次搶修的優秀,優秀的話就選它,然後更換 description 小剛在玩jsoi提供的乙個稱之為 建築搶修 的電腦遊戲 經過了一場激烈的戰鬥,t部落消滅了所有z部落的入侵者。但是t部...