題目串連:311 - Packets
題目大意:總共有6種包裹,1 * 1、2 * 2、3 * 3、4 * 4、 5* 5、6 * 6,給出6種包裹的個數,現在有若干個6 * 6 的箱子,問,最少需要多少個箱子可以將所有的包裹裝好。
解題思路:一開始想成了用分治法去做,結果大部分資料可以過,一些特殊的就不行了,後來才發現這題是到貪心的題目,4、5、6規格的包裹一個包裹就要佔一個箱子,剩下的空隙用2和1大小的包裹去填充,一定要先預設是2 * 2的, 如果放得下的話,因為如果後面可以放2 * 2 的位置太多了, 可以轉換成4 個1 * 1的。然後就是比較特殊的3 * 3,3 * 3的4 個可以填滿一個箱子,所以只要列舉出剩餘1,2,3的情況就可以了。
#include <stdio.h>const int N = 7;int sum[N], n;const int one[] = {0, 7, 6, 5};const int two[] = {0, 5, 3, 1};int main() { while (1) {// Read;int flag = 1;n = 0;for (int i = 1; i < N; i++) { scanf("%d", &sum[i]); if (sum[i])flag = 0;}if (flag) break;int total = sum[6] + sum[5] + sum[4] + (sum[3] + 3) / 4;int numOne = sum[5] * 11 + one[sum[3] % 4];int numTwo = sum[4] * 5 + two[sum[3] % 4];if (numTwo < sum[2]) { int cur = sum[2] - numTwo; int tmp = (cur + 8) / 9; total += tmp; numOne += 4 * (9 * tmp - cur); }else numOne += 4 * (numTwo - sum[2]);if (numOne < sum[1]) total += (sum[1] - numOne + 35) / 36;printf("%d\n", total); } return 0;}