1. 程式人生 > >[USACO 1.3.1]混合牛奶

[USACO 1.3.1]混合牛奶

題目描述

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

    }
}