POJ 1017 裝箱問題 【模擬】
阿新 • • 發佈:2018-12-13
一個大箱 6*6*h
產品 有1*1*h 2*2*h 。。。。。。6*6*h
然後給各型別產品的個數 問最少用多少個大箱
太簡潔了 思路太好 值得學習
#include<iostream> using namespace std; int main(){ int num[7]; int threetwo[4] = {0, 5, 3, 1};//當一個大箱放0個3*3 補0個2*2 。放1個3*3 補5個2*2 。 放2個3*3 補3個2*2 。放3個3*3 補1個2*2 while (1){ int sum = 0; for (int i = 1; i <= 6; ++i) { scanf("%d", &num[i]); sum += num[i]; } if (!sum){ break; } int ans = 0; ans += num[6] + num[5] + num[4] + (num[3] + 3) / 4;//6*6 5*5 4*4 3*3(一個大箱可以放4個) 其他都會佔一個大箱 //6*6搞定 5*5可以補1*1 4*4可以補2*2 1*1 3*3 以補2*2 1*1 int two, one; //一個大箱可以放 1個4*4 和 5個 2*2 two = 5 * num[4] + threetwo[num[3] % 4];//這個two是最多放2*2的個數 if (two < num[2]){//還不夠放 就要加大箱來放2*2 ans += (num[2] - two + 8) / 9; } one = ans * 36 - 36 * num[6] - 25 * num[5] - 16 * num[4] - 9 * num[3] - 4 * num[2]; if (one < num[1]) ans += (num[1] - one + 35) / 36; printf("%d\n", ans); } return 0; }
相比我的
#include<iostream> #include<cstdio> using namespace std; int main(){ int num[7]; while (1){ int sum = 0; for (int i = 1; i <= 6; ++i) { scanf("%d", &num[i]); sum += num[i]; } if (!sum){ break; } int ans = 0; if (num[6]){ ans += num[6]; //printf("6 %d\n", ans); } if (num[5]){ ans += num[5]; num[1] -= 11 * num[5];//都放1*1 if (num[1] < 0) num[1] = 0; //printf("5 %d\n", ans); } if (num[4]){ ans += num[4]; int tmp = 20 * num[4];//能剩tmp空間 tmp -= num[2] * 4; //減去2*2佔的空間 如果num【2】 放不完 tmp自然負數 num[2] -= num[4] * 5;//能放多少就放多少 if (num[2] < 0)//放完了num【2】 num[2] = 0; //如果2 * 2 已經放完了 1*1還有 就放 tmp個1*1 tmp自然是正數 if (num[2] == 0 && num[1]){ num[1] -= tmp; if (num[1] < 0) num[1] = 0; } //printf("4 %d\n", ans); } if (num[3]){ ans += num[3] / 4;//6*6可以放4個3*3 int tmp = num[3] % 4; //還有3*3剩 單獨佔一個大箱 剩1個2個3個 if (tmp){ ans++; int leave = 36 - tmp * 9; //可以放5個2*2 7個1*1 if (leave == 27){ if (num[2]){ num[2] -= 5; if (num[2] < 0) num[2] = 0; } if (num[1]){ num[1] -= 7; if (num[1] < 0) num[1] = 0; } } //可以放3個2*2 6個1*1 else if (leave == 18){ if (num[2]){ num[2] -= 3; if (num[2] < 0) num[2] = 0; } if (num[1]){ num[1] -= 6; if (num[1] < 0) num[1] = 0; } } //可以放1個2*2 5個1*1 else if (leave == 9){ if (num[2]){ num[2] -= 1; if (num[2] < 0) num[2] = 0; } if (num[1]){ num[1] -= 5; if (num[1] < 0) num[1] = 0; } } } //printf("3 %d\n", ans); } if (num[2]){ ans += num[2] / 9; int tmp = num[2] % 9; if (tmp){ ans++; int leave = 36 - 4 * tmp; if (num[1]){ num[1] -= leave; if (num[1] < 0) num[1] = 0; } } //printf("2 %d\n", ans); } if (num[1]){ ans += num[1] / 36; if (num[1] % 36) ans++; //printf("1 %d\n", ans); } printf("%d\n", ans); } return 0; }