首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

HDU 2187:悼念 512 汶川大地震——貪心算法採購大米

     編輯:關於C語言

HDU 2187:悼念 512 汶川大地震——貪心算法採購大米

時間:2008 年 5 月 16 日(震後第 4 天)
地點:汶川縣牛腦寨
人物:羌族老奶奶

牛腦寨是一個 600 多人的羌族寨子,震後幾天,這裡仍常聽到隆隆聲響——對面山上石頭不斷滑落。完成搶修移動基站任務後,我拿起相機記錄受災情況。突然,視線中出現一位羌族老人,讓我無比震驚:那是極陡的坡,佝僂著腰的老人是如何艱難爬上來的?她上來做什麼?

老人在廢墟中尋找家園

老人身後是極陡的坡,僅有一隻眼睛有微弱視力,望著滿地廢墟徘徊良久。家在哪裡?她拼盡微弱視力尋找。曾經的家就旁邊,但滿目廢墟已讓她辨識不出。她舉目遠眺,期盼看到家的一點痕跡。原來家就在旁邊,左手抓住一塊房檐,勉強站穩。地震過了三天,這是她第一次回到曾經的家。

老人在廢墟前

一個倒塌的櫃子,裡面裝著一絲希望。老人費力搬開覆蓋在櫃子上的薪柴,找到一把木匠用的刨子,老淚縱橫——或許有哪位逝去的親人是木匠。睹物思人,逝者已矣。

老人找到木匠刨子

繼續尋找,一把散碎的掛麵映入眼簾。她顫顫巍巍撈起鋪滿灰塵的掛麵,再次流淚……看著她仔細把掛麵放進胸前圍裙,我驟然明白:這是老人在外援抵達前賴以生存的口糧。若非交通中斷、救援無法進入,80 多歲的老人豈會拖著軀體、強忍失去親人的痛苦,重返這奪走親人生命的廢墟,尋覓這點點掛麵?老人是真餓了……

老人撿起掛麵

老人佝僂著腰,低聲喃喃:「你們走了,我可怎麼活?」拿著對我們城市人微不足道的掛麵,遠去了……

補充:拍完這組照片後才知,5 月 14 日軍用運輸機首次向汶川空投物資就降落在牛腦寨,受災村民沒有佔為己有,而是汗流浹背走了兩小時背到山下縣城交給政府。


對於倖存災民,最迫切的是溫飽問題。救災部隊一邊搶通交通,一邊組織採購糧食。假設撥付一定救災經費去市場採購散裝大米。市場有 m 種大米,各自單價與重量已知,為滿足更多災民需求,最多能採購多少重量的大米?

輸入格式

首先一個正整數 C,表示測試案例數。
每組案例第一行兩整數 n、m(0<n≤1000, 0<m≤1000),分別為經費金額與大米種類數。
接下來 m 行,每行兩整數 p、h(1≤p≤25, 1≤h≤100),代表單價與該大米重量。

輸出格式

對每組測試數據,輸出能購買的最大大米重量(假設經費買不光所有大米),保留兩位小數,每實例佔一行。

範例輸入

1
7 2
3 3
4 4

範例輸出

2.33

解題分析

經典分數背包問題。為在固定經費下獲得最大重量,應優先購買單位價格最低(即性價比最高)的大米。按單價 p 從小到大排序,依次購買:若經費足夠買下該種大米全部庫存,則全買並扣除費用;否則用剩餘經費盡可能多買該大米(可買部分),然後結束。

時間複雜度 O(m log m),主要來自排序。

參考代碼 (C++)

#include <cstdio>
#include <algorithm>
using namespace std;

struct Rice {
    int price, weight;
} r[1010];

bool cmp(const Rice &a, const Rice &b) {
    return a.price < b.price; // 單價升序
}

int main() {
    int T;
    scanf("%d", &T);
    while (T--) {
        int n, m;
        scanf("%d%d", &n, &m);
        for (int i = 0; i < m; i++)
            scanf("%d%d", &r[i].price, &r[i].weight);
        sort(r, r + m, cmp);
        double totalWeight = 0;
        for (int i = 0; i < m && n > 0; i++) {
            int costAll = r[i].price * r[i].weight;
            if (costAll <= n) {
                n -= costAll;
                totalWeight += r[i].weight;
            } else {
                totalWeight += (double)n / r[i].price;
                n = 0;
            }
        }
        printf("%.2f\n", totalWeight);
    }
    return 0;
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved