题意:
给你一个一组一定数目大小为1*1,2*2,3*3,4*4,5*5,6*6的小方块,让你装进一个6*6的方块里,求最少需要多少个6*6方块数
思路:
参考了别人的做法。
贪心 ,若有多余则先装2*2的,后装1*1的,因为装了2*2若有多余仍可拆分成1*1
6*6可装 -> 一个6*6
-> 一个5*5+11个1*1
->一个4*4+5个2*2
规格为3的分开讨论(一个6*6方块里装4,3,2,1,个3*3)
将大小为6,5,4,3的都讨论后再最后算2和1
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int a[6];
int main() {
while (scanf("%d%d%d%d%d%d", &a[1], &a[2], &a[3], &a[4], &a[5], &a[6])) {
if (!a[1] && !a[2] && !a[3] && !a[4] && !a[5] && !a[6])
break;
int cnt = 0;
cnt += a[5];
cnt += a[6];
a[1] -= a[5] * 11;
cnt += a[4];
a[2] -= a[4] * 5;
//3*3的情况:
cnt+=a[3]/4;
//a[3]<4
if (a[3]%4 == 1) {
cnt++;
a[2] -= 5;
a[1] -= 7;
}
else if (a[3]%4 == 2) {
cnt++;
a[2] -= 3;
a[1] -= 6;
}
else if(a[3]%4==3){
cnt++;
a[2] -= 1;
a[1] -= 5;
}
if (a[2] < 0) {
a[1]+=4*a[2];
a[2] =0;
}
if (a[1] < 0)
a[1] = 0;
cnt += (a[1] + 4 * a[2]) / 36;
if ((a[1] + 4 * a[2]) % 36 != 0)
cnt++;
printf("%d\n", cnt);
}
}