Problem R Problem ID:1017
簡單題意:物品共有六種規格:1*1, 2*2, 3*3, 4*4, 5*5, 6*6,它們將被放到6*6的包裹裏送到客戶手中。已知各個規格的物品數量,求最少需要多少個包裹。
解題思路形成過程:從6*6的物品開始往下遍歷,優先放更大的物品:
①每個6*6的物品單獨佔一個包裹;
②5*5的物品還可以一起放置11個1*1的物品;
③4*4的物品可以一起放置5個2*2的物品;
④3*3的物品可以一起放置3個3*3的物品或5個2*2+7個1*1的物品;
⑤2*2的物品可以一起放置8個2*2的物品或32個1*1的物品;
⑥一個包裹裏如果全部放1*1的物品則可以放置36個。
(上述過程中如果2*2的物品已經放完,則每個2*2的物品可以換成4個1*1的物品)
感想:注意細節。不知道哪裏出錯時可以嘗試自己寫一些例子進行測試。
代碼:
#include<iostream>
#include<stdio.h>
using namespace std;
int a[6];
void de1(int n)
{
if(a[0]<=n)
a[0]=0;
else
a[0]-=n;
}
void de2(int n)
{
if(a[1]>=n)
a[1]-=n;
else
{
int m=4*(n-a[1]);
a[1]=0;
de1(m);
}
}
void de3(int n)
{
if(a[2]>=n)
a[2]-=n;
else if(a[2]==0){
de2(5);
de1(7);
}
else if(a[2]==1){
a[2]=0;
de2(3);
de1(6);
}
else if(a[2]==2){
a[2]=0;
de2(1);
de1(5);
}
}
int main()
{
while(1){
int cnt=0;
scanf("%d%d%d%d%d%d",&a[0],&a[1],&a[2],&a[3],&a[4],&a[5]);
if((a[0]||a[1]||a[2]||a[3]||a[4]||a[5])==false)
return 0;
if(a[5]){
cnt+=a[5];
a[5]=0;
}
for(int i=4;i>=0;--i){
if(i==4)
while(a[i]){
--a[i];
de1(11);
++cnt;
}
else if(i==3)
while(a[i]){
--a[i];
de2(5);
++cnt;
}
else if(i==2)
while(a[i]){
--a[i];
de3(3);
++cnt;
}
else if(i==1)
while(a[i]){
--a[i];
de2(8);
++cnt;
}
else if(i==0)
while(a[i]){
--a[i];
de1(35);
++cnt;
}
}
cout<<cnt<<endl;
}
}