[POJ1017]Packets 作者: rin 时间: February 1, 2017 分类: Algo # 题目描述 一家工厂生产的产品以相同的高$$h$$,六种不同的长宽$$1\*1,2\*2,3\*3,4\*4,5\*5,6\*6$$包装。 送货时集装的箱子的高也为$$h$$,长宽为$$6*6$$。 根据每种尺寸的产品的个数求出最少需要多少箱子来装。 # 输入 输入包含多组数据 每组数据为一行六个数,分别代表边长$$1$$到$$6$$产品的个数。 输入以六个$$0$$结束。 # 输出 每组数据输出一行一个数,代表最少需用的箱子个数。 # 样例输入 ``` 0 0 4 0 0 1 7 5 1 0 0 0 0 0 0 0 0 0 ``` # 样例输出 ``` 2 1 ``` --- # 解 贪心,先放大的,再用小的来塞。 ## 大的 一个$$6\*6$$的产品就能塞满一个箱子 一个$$5\*5$$的产品也得占一个箱子,并空出$$12$$个$$1\*1$$的位置 一个$$4\*4$$的产品也得占一个箱子,并空出$$5$$个$$2\*2$$的位置(因为先大后小所以按$$2\*2$$数而不是$$1\*1$$) 以上尺寸是箱子里同种只能放下一个的。 **四个**$$3\*3$$的产品占一个箱子,如果凑不出$$4$$的倍数个,那么根据余数不同能剩出不同个数的更小空间。 余数为$$1$$时,剩出$$5$$个$$2\*2$$,$$7$$个$$1\*1$$ 余数为$$2$$时,剩出$$3$$个$$2\*2$$,$$6$$个$$1\*1$$ 余数为$$3$$时,剩出$$1$$个$$2\*2$$,$$5$$个$$1\*1$$ ## 小的 以上大的装完之后,首先用空出来的装$$2\*2$$的产品。如果仍然不够,那么就开新箱子,则又能空出一些$$1\*1$$的空间;如果够了,就把没用完的剩余空间全部计入$$1\*1$$中。 最后装$$1\*1$$的,同上,再有剩余的就空着了。 ## Code ```c++ //AC //http://poj.org/problem?id=1017 //https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=247 //http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1307 #include #include #include #include #include #include #include using namespace std; #define INF 0x3f3f3f3f int a, b, c, d, e, f;// 6种边长 int main() { #ifndef ONLINE_JUDGE freopen("in.txt", "r", stdin); #endif ios::sync_with_stdio(0); cin.tie(0); int res = 0; while (cin >> a >> b >> c >> d >> e >> f && (a || b || c || d || e || f)) { int validA = 0, validB = 0; res = f + e + d; // 每个边长为4、5、6的必须装到一个新箱子里 validA = 11 * e; // 边长为5的每装一个箱就空出11个边长为1的位子 validB = 5 * d; // 边长为4的每装一个箱就空出5个边长为2的位子 res += ceil((double)c / 4.0); // 装边长为3的箱子个数 int toomanyC = c % 4; // 最后一个用来装边长3的箱子里只装了几个3 if (toomanyC == 1) { // 只装了1个,则能空出5个2,7个1 validB += 5; validA += 7; } else if (toomanyC == 2) { validB += 3; validA += 6; } else if (toomanyC == 3) { validB += 1; validA += 5; } if (b > validB) { // 如果能当前剩的2的位子不够,则看用完之后需不需要补箱子,并更新空出的1 b -= validB; validB = 0; res += ceil((double)b / 9.0); int toomanyB = b % 9; validA += 36 - 4 * toomanyB; //剩余的都给1 validB = 0; } else { //如果够装2,就都用掉。 validB -= b; } validA += validB * 2 * 2; //最后装1,把所有大小的空位都归入1 validB = 0; a -= validA; if (a > 0) { res += ceil((double)a / 36.0); } cout << res << '\n'; } return 0; } ``` 标签: none
你的ssl证书是自己签发的?
不是,是 Let's Encrypt那个
咳咳,你又消失了很久了
……害怕
来看看大佬
突然发现这是顺丰用的包装箱型号啊我擦
那顺丰要完
衷心祝愿某一天某博主能记起来他的博客密码
你这么一说我想起来了(x
很快,你就长达一年半不更了
新年快乐~