uva 311 Packets(貪心)

來源:互聯網
上載者:User

題目串連: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;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.