UVA311 Packets

知识点:贪心

很开心这次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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值