填满的时候:一个6*6=一个5*5+十一个1*1=一个4*4+五个2*2=4个3*3=9个2*2=36个1*1
填不满的时候类似。。。
一个2*2=四个1*1.它俩之间的转换比较常用。
一开始转换的时候忘了乘以4,WA了N次。。
每次尽量先用大的,大的不足再用小的。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
int p[10];
void Pocket1(int x)
{
if(p[1]>=x) p[1]-=x;
else p[1]=0;
}
void Pocket2(int x)
{
if(p[2]>=x) p[2]-=x;
else
{
Pocket1((x-p[2])*4);
p[2]=0;
}
}
int main()
{
int sum;
while(scanf("%d%d%d%d%d%d",&p[1],&p[2],&p[3],&p[4],&p[5],&p[6])&&!(!p[1]&&!p[2]&&!p[3]&&!p[4]&&!p[5]&&!p[6]))
{
sum=0;
sum+=p[6];
sum+=p[5];
Pocket1(p[5]*11);
sum+=p[4];
Pocket2(p[4]*5);
if(p[3]%4==0) sum+=p[3]/4;
else
{
sum+=p[3]/4+1;
if(p[3]%4==1)
{
Pocket2(5);
Pocket1(7);
}
else if(p[3]%4==2)
{
Pocket2(3);
Pocket1(6);
}
else
{
Pocket2(1);
Pocket1(5);
}
}
if(p[2]%9==0) sum+=p[2]/9;
else
{
sum+=p[2]/9+1;
Pocket1(36-4*(p[2]%9));
}
if(p[1]%36==0) sum+=p[1]/36;
else sum+=p[1]/36+1;
printf("%d\n",sum);
}
return 0;
}