知识点:贪心
很开心这次15分钟过了这个题,我记得以前写错的一大原因就是处理n1和n2的时候,我是先让n2为零,然后处理n1,因为n1表达式里面有n2,所以就错了,
这个题可以说是一个思维题,但是里面有贪心的思想,我看别人有的代码真的很短,但是那不一定是最好的,自己想出来的,能在考场上写出来的才是最好的,
思路很简单,一个一个考虑,从大到小,这里就有点像贪心,
边长6,我们就只能加上边长为6的盒子
边长5,加上边长5的数目,然后所有的空格都给边长1
边长4,加上边长4的数目,然后分两种情况讨论,能都给2就给2,如果给了2还有剩余那么就把剩余的给1,这里需要注意的是,我们边长1的个数可以是负数,边长2不能,这个应该是显而易见
边长3,这是最复杂的情况,能整除,就加上整除的结果,不能,分成余数为1,2,3的三种情况,假如余数是1,那么最多能装5个边长2,把能给的都给边长2,如果还有剩余的位置,那么给边长1,余数是2,3的类似,箱子剩余的位置分别最多能装3个边长2,1个边长2
边长2,这时,只用考虑边长2和边长1就可以了,分类讨论一下整除就可以了,
边长1,小于等于0就不用考虑了,相当于之前已经把1装完了,还有一些位置空着的,大于0分类讨论一下就好了,
然后这道题就完了,15分钟过了,
#include <bits/stdc++.h>
using namespace std;
int main() {
int n1, n2, n3, n4, n5, n6;
while (cin >> n1 >> n2 >> n3 >> n4 >> n5 >> n6) {
if (!n1 && !n2 && !n3 && !n4 && !n5 && !n6) break;
int ans = 0;
ans += n6;
ans += n5;
n1 -= n5 * 11;
ans += n4;
if (n2 < n4 * 5) {
n1 -= (n4 * 5 - n2) * 4;
n2 = 0;
} else {
n2 -= n4 * 5;
}
int temp;
if (n3 % 4 == 0) {
ans += n3 / 4;
} else {
ans += n3 / 4 + 1;
temp = n3 % 4;
if (temp == 1) {
if (n2 >= 5) { n2 -= 5; n1 -= 7; }
else { n1 -= 7 + (5 - n2) * 4; n2 = 0; }
} else if (temp == 2) {
if (n2 >= 3) { n2 -= 3; n1 -= 6; }
else { n1 -= 6 + (3 - n2) * 4; n2 = 0; }
} else {
if (n2 >= 1) { n2 -= 1; n1 -= 5; }
else { n1 -= 5 + (1 - n2) * 4; n2 = 0; }
}
}
if (n2 % 9 == 0) {
ans += n2 / 9;
} else {
ans += n2 / 9 + 1;
temp = n2 % 9;
n1 -= (9 - temp) * 4;
}
if (n1 > 0) {
if (n1 % 36) ans += n1 / 36 + 1;
else ans += n1 / 36;
}
cout << ans << endl;
}
return 0;
}