題目大意就是在一個6*6的盒子裏,放一些不同大小的方片 1*1、2*2、......6*6
求把所有方片放下所需盒子的最小數量
用sum記錄
對於6*6的方片,必須得用一個盒子 sum+=num[6];
對於5*5的方片,首先必須用一個盒子才能將其裝下,所以sum+=num[5];剩下的空間只能裝1*1的方片了,所以判斷num[1]與11的大小,
num[1]>11?num[1]-=11:num[1]=0;
4*4的方片,也需佔用一個盒子——sum+=num[4],剩下的空間可以裝下5個2*2的方片,於是首先用2*2的方片來填,2*2的不夠了,再用1*1的來填
3*3的方片,一個盒子可以裝下四個, 所以sum+=num[3]%4?num[3]/4+1:num[3]/4;
3*3的方片沒裝滿的情況分類討論了: 對於只裝了1個3*3方片的盒子 還能放下5個2*2的方片及7個1*1的方片
對於只裝了2個3*3方片的盒子 還能放下3個2*2的方片及6個1*1的方片
對於只裝了3個3*3方片的盒子 還能放下1個2*2的方片及5個1*1的方片
至於2*2的方片和1*1的方片就比較簡單了
我的代碼:
#include <iostream>
#include <map>
#include <stdio.h>
#include <algorithm>
#include <cstring>
using namespace std;
int num[7];
int main()
{
while (1)
{
int i(1);
while (i<=6)
cin>>num[i++];
bool pan(0);
i=1;
while (i<=6)
{
if (num[i])
{
pan=1;
break;
}
++i;
}
if (!pan) break;
int sum(0);
int sub;
sum+=num[6];
sum+=num[5];
sub=num[5]*11;
if (num[1]>=sub) num[1]-=sub;
else num[1]=0;
sum+=num[4];
sub=5*num[4];
if (num[2]>=sub) num[2]-=sub,sub=0;
else
{
sub-=num[2];
num[2]=0;
}
sub*=4;
if (num[1]>=sub) num[1]-=sub;
else num[1]=0;
if (num[3]%4==0)
sum+=num[3]/4;
else
{
sum+=num[3]/4+1;
sub=num[3]%4;
num[1]-=8-sub;
sub=7-2*sub;
if (num[2]>=sub) num[2]-=sub,sub=0;
else
{
sub-=num[2];
num[2]=0;
}
sub*=4;
if (num[1]>=sub) num[1]-=sub;
else num[1]=0;
}
if (num[2]%9)
{ sum+=num[2]/9+1;
num[2]%=9;
sub=36-4*num[2];
if (num[1]>=sub) num[1]-=sub;
else num[1]=0;
}
else sum+=num[2]/9;
if (num[1]%36)
sum+=num[1]/36+1;
else sum+=num[1]/36;
cout<<sum<<endl;
}
return 0;
}