版权声明:博主的博客不值钱随便转载但要注明出处 https://blog.csdn.net/easylovecsdn/article/details/84060984
这个题不难,关键是滤清思路,明确怎么放是最大利用空间的。
还有POJ不晓得为啥子,炸了好几天,这道题隔了好久才交上。
思路:
6*6:一个就要独占一个箱子
5*5:一个要独占一个箱子,放完后还可以再放11个1*1
4*4:一个要独占一个箱子,放完后可以再放5个2*2(先紧着大的放),然后如有空余再用1*1填补
3*3:这个比较麻烦,要把情况分开考虑(看我代码里分的情况)
2*2和1*1和上面思路一样;
代码写的不是很简洁,大家凑合看吧,反正是ac了;
#include <iostream>
using namespace std;
int a[7];
int main()
{
while (!cin.eof())
{
int sum = 0;
for (int i = 1; i <= 6; i++) {cin >> a[i]; sum += a[i];}
if (!sum) break;
int ans = 0;
if (a[6]) ans += a[6];
if (a[5])
{
ans += a[5];
int area = a[5] * 11;
a[1] = (a[1] - area) <= 0 ? 0 : (a[1] - area);
}
if (a[4])
{
ans += a[4];
int area = 20 * a[4];
if (a[2])
{
if (area - a[2] * 4 <= 0)
{
a[2] -= (area / 4);
area = 0;
}
else
{
area -= a[2] * 4;
a[2] = 0;
}
}
if (area && a[1])
{
if (area - a[1] <= 0) a[1] -= area;
else a[1] = 0;
}
}
if (a[3])
{
ans += (a[3] / 4);
a[3] %= 4; //3*3还剩下一部分
if (a[3]) {
int area = 36 - (9 * a[3]);
ans += 1;
if (a[3] == 1)
{
area = 27;
if (a[2])
{
if (a[2] <= 5)
{
area -= (4 * a[2]);
a[2] = 0;
}
else
{
area -= 20;
a[2] -= 5;
}
}
if (area)
{
if (a[1])
{
if (a[1] <= area) a[1] = 0;
else a[1] -= area;
}
}
}
else if (a[3] == 2)
{
area = 18;
if (a[2])
{
if (a[2] <= 3)
{
area -= (4 * a[2]);
a[2] = 0;
}
else
{
area -= 12;
a[2] -= 3;
}
}
if (area)
{
if (a[1] >= area) a[1] -= area;
else a[1] = 0;
}
}
else if (a[3] == 3)
{
if (a[2])
{
a[2] -= 1;
if (a[1])
{
if (a[1] <= 5) a[1] = 0;
else a[1] -= 5;
}
}
else
{
if (a[1])
{
if (a[1] <= 9) a[1] = 0;
else a[1] -= 9;
}
}
}
}
}
if (a[2])
{
ans += (a[2] / 9);
a[2] %= 9;
if (a[2])
{
int area = 36 - (4 * a[2]);
a[1] = (a[1] - area <= 0) ? 0 : (a[1] - area);
ans++;
}
}
if (a[1])
{
ans += (a[1] % 36 == 0) ? (a[1] / 36) : (a[1] / 36) + 1;
}
cout << ans << endl;
}
return 0;
}