1. 程式人生 > 其它 >117 混合牛奶

117 混合牛奶

問題描述 :

牛奶包裝是一個如此低利潤的生意,所以儘可能低的控制初級產品(牛奶)的價格變得十分重要。請幫助快樂的牛奶製造者(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

思想:和上題類似,用一個結構體儲存奶農的資訊,然後按價格從小到大排序,後面累加到足夠的數量就結束輸出即可。

 

#include <stdio.h>
#include <string.h>


struct farmer{
    int price;
    int num;
};

void sortPrice(struct farmer p[],int fnum){
    int i,j,k;
    for(i=0;i<fnum-1;i++){
        for(j=0;j<fnum-1-i;j++){
            if(p[j].price>p[j+1
].price){ struct farmer temp = p[j+1]; p[j+1] = p[j]; p[j] = temp; } } } } int main() { int num,fnum,i,j,k; int sum = 0; int cur = 0; scanf("%d %d",&num,&fnum); struct farmer f[fnum]; getchar(); for(i=0;i<fnum;i++){ scanf("%d %d",&f[i].price,&f[i].num); } sortPrice(f,fnum); for(i=0;i<fnum;i++){ if(cur+f[i].num<=num){ cur+=f[i].num; sum +=f[i].num*f[i].price; }else{ int need = num-cur; sum += need*f[i].price; break; } } printf("%d\n",sum); }