[USACO 1.3.1]混合牛奶
阿新 • • 發佈:2018-12-12
題目描述
牛奶包裝是一個如此低利潤的生意,所以儘可能低的控制初級產品(牛奶)的價格變的十分重要。請幫助快樂的牛奶製造者(Merry Milk Makers)以可能的最廉價的方式取得他們所需的牛奶。快樂的牛奶製造公司從一些農民那購買牛奶,每個農民賣給牛奶製造公司的價格不一定相同。而且,如一隻母牛一天只能生產一定量的牛奶,農民每一天只有一定量的牛奶可以賣。每天,快樂的牛奶製造者從每個農民那購買一定量的牛奶,少於或等於農民所能提供的最大值。給出快樂牛奶製造者的每日的牛奶需求,連同每個農民的可提供的牛奶量和每加侖的價格,請計算快樂的牛奶製造者所要付出錢的最小值。注意: 每天農民生產的牛奶的總數對快樂的牛奶製造者來說足夠的。
輸入
第 1 行:二個整數, N 和 M。第一個數值,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 一天能賣給快樂的牛奶製造者的牛奶數量。
輸出
單獨的一行包含單獨的一個整數,表示快樂的牛奶製造者拿到所需的牛奶所要的最小費用
樣例輸入
100 5
5 20
9 40
3 10
8 80
6 30
樣例輸出
630
分析:
本題,其實和01揹包是一樣的。是貪心問題。在此題中,我們要注意的是,這裡是要按單價排序。然後在依次遍歷。
#include"stdio.h" #include"string.h" typedef struct Pricee{ long long p; long long w; }milk; int main() { long long N,M; long long i,j,k; long long P; milk node[10000],transfer; while(~scanf("%lld%lld",&N,&M)) { for(i=0;i<M;i++) scanf("%lld%lld",&node[i].p,&node[i].w); for(i=0;i<M-1;i++) for(j=i;j<M;j++) { if(node[i].p>node[j].p) { transfer=node[i]; node[i]=node[j]; node[j]=transfer; } } P=0; for(i=0;i<M;i++) { if(N>=node[i].w) { P=P+node[i].p*node[i].w; N=N-node[i].w; } else { P=P+N*node[i].p; N=0; } } printf("%lld\n",P); } }