1. 程式人生 > 實用技巧 >P1208 [USACO1.3]混合牛奶

P1208 [USACO1.3]混合牛奶

題目描述

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

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

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

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

輸入格式

第一行二個整數 n,m,表示需要牛奶的總量,和提供牛奶的農民個數。

接下來 m 行,每行兩個整數 pi,ai, 表示第 i 個農民牛奶的單價,和農民 i 一 天最多能賣出的牛奶量。

輸出格式

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

輸入輸出樣例

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

說明/提示

【資料範圍】
對於 100% 的資料
0≤ n,ai ≤ 2 * 10^6 , 0 ≤ m 5000, 0 pi 1000

程式碼如下
#include<iostream>
#include<algorithm>
using namespace
std; const int MAXN = 2e6 + 5; struct milk // 牛奶 { int price; // 單價 int num; // 一天能賣出最多的牛奶量 }M[MAXN]; int n, m, total; // 需要牛奶總量 農民個數 需要花費的錢 bool cmp(milk x, milk y) // 返回 單價較小的奶 { return x.price < y.price; } int main() { cin >> n >> m;
for(int i = 1; i <= m; i++) { cin >> M[i].price >> M[i].num; } sort(M + 1, M + 1 + m, cmp); // 按照單價 從低到高 將牛奶排序 for(int i = 1; i <= m; i++) { n = n - M[i].num; // 需要的總量 - 目前牛奶的量(不要忽略 小於0 的情況) if(n > 0) { total = total + M[i].price * M[i].num; // 大於 0 時,剛剛需要的錢 + 現在牛奶的錢 } else { total = total + M[i].price * (M[i].num + n); // 小於 0 時, 說明現在 牛奶的量 超過了 剛剛還需要的量 break; // 要減去富裕的數量 例如:所需為 1 , 現有 5 ,n = 1 - 5 = -4 } // 算出所需要的量為 -4 + 5 = 1 } cout << total << endl; return 0; }

結束