USACO - Chapter1 Section 1.3 - Mixing Milk

Mixing Milk

題目描述

由於乳製品產業利潤很低,所以降低原材料(牛奶)價格就變得十分重要。幫助Marry乳業找到最優的牛奶採購方案。

Marry乳業從一些奶農手中採購牛奶,並且每一位奶農爲乳製品加工企業提供的價格是不同的。此外,就像每頭奶牛每天只能擠出固定數量的奶,每位奶農每天能提供的牛奶數量是一定的。每天Marry乳業可以從奶農手中採購到小於或者等於奶農最大產量的整數數量的牛奶。

給出Marry乳業每天對牛奶的需求量,還有每位奶農提供的牛奶單價和產量。計算採購足夠數量的牛奶所需的最小花費。

注:每天所有奶農的總產量大於Marry乳業的需求量。

輸入輸出格式

輸入格式:
第 1 行共二個數值:N,(0<=N<=2,000,000)是需要牛奶的總數;M,(0<= M<=5,000)是提供牛奶的農民個數。

第 2 到 M+1 行:每行二個整數:Pi 和 Ai。

Pi(0<= Pi<=1,000) 是農民 i 的牛奶的單價。

Ai(0 <= Ai <= 2,000,000)是農民 i 一天能賣給Marry的牛奶製造公司的牛奶數量。

輸出格式:
單獨的一行包含單獨的一個整數,表示Marry的牛奶製造公司拿到所需的牛奶所要的最小費用。

輸入輸出樣例

輸入樣例#1:
100 5
5 20
9 40
3 10
8 80
6 30
輸出樣例#1:
630

最最簡單的貪心,每一個農民賣的牛奶只有兩個參數,價格,和可賣出的最大數量。
在沒達到購買需求之前,從最便宜的牛奶買起,買光了就買次便宜的牛奶,直到達到目標。

一個值得注意的細節是,採用結構體存儲奶農數據,重載小於符號,按照價格排序。

Code

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
struct farm
{
    int price,maxn;
    bool operator < (const farm & a) const
    {
        return price < a.price;
    }
}a[5005];
int main()
{
    int want,n;
    cin >> want >> n;
    if (n == 0) cout << 0;
    for (int i=0;i<n;i++)
    {
        cin >> a[i].price >> a[i].maxn;
    }
    sort(a,a+n);
    int mkn = 0;
    int ans = 0;
    for (int i=0;i<n;i++)
    {
        if (mkn + a[i].maxn < want)
        {
            ans += a[i].price*a[i].maxn;
            mkn += a[i].maxn;
        }
        else
        {
            ans += (want-mkn)*a[i].price;
            cout << ans;
            return 0;
        }
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章