道可道,非常道

无名者,圣人也
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

[原创]USACO:Mixing Milk问题分析

Posted on 2008-03-30 12:34  一岩一道  阅读(768)  评论(0编辑  收藏  举报

问题描述(译 by tim green
牛奶包装是一个如此低利润的生意,所以尽可能低的控制初级产品(牛奶)的价格变的十分重要。
请帮助快乐的牛奶制造者(Merry Milk Makers)以可能的最廉价的方式取得他们所需的牛奶。
快乐的牛奶制造公司从一些农民那购买牛奶,每个农民卖给牛奶制造公司的价格不一定相同。
而且,如一只母牛一天只能生产一定量的牛奶,农民每一天只有一定量的牛奶可以卖。
每天,快乐的牛奶制造者从每个农民那购买一定量的牛奶,少于或等于农民所能提供的最大值。
给出快乐牛奶制造者的每日的牛奶需求,连同每个农民的可提供的牛奶量和每加仑的价格,请计算快乐的牛奶制造者所要付出钱的最小值。
注意:
每天农民生产的牛奶的总数对快乐的牛奶制造者来说足够的。


PROGRAM NAME: milk

INPUT FORMAT
第 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 一天能卖给快乐的牛奶制造者的牛奶数量。

SAMPLE INPUT (file milk.in)
100 5
5 20
9 40
3 10
8 80
6 30

OUTPUT FORMAT
单独的一行包含单独的一个整数,表示快乐的牛奶制造者拿到所需的牛奶所要的最小费用

SAMPLE OUTPUT (file milk.out)
630

问题分析:
这道题比较简单,只要先按价格排序,然后累加低价格牛奶,直到达到要求的数量,在这个过程中计算花费就可以了。
使用一个结构体记录牛奶价格和数量也会比较方便。排序可以使用快速排序。
代码如下:
/*
ID:jallery1
LANG:C++
TASK:milk
*/

#include
<iostream>
#include
<fstream>
#include
<string>

using namespace std;

typedef 
struct Milk
{
    
int price;
    
int num;
};

void quicksort(Milk [],int,int);

int main()
{
    ifstream fin(
"milk.in");
    ofstream fout(
"milk.out");
    
int n,m;
    fin
>>n>>m;

    Milk milk[
5000];
    
for(int i=0;i<m;i++)
        fin
>>milk[i].price>>milk[i].num;
    quicksort(milk,
0,m-1);//快速排序,价格由低到高
    int num;
    
int money=0;
    
int i=0;
    
while(n>0)
    {
        num
=milk[i].num; //某个价格的牛奶数量
        if(n-num<=0) num=n; //如果所需购买的数量已经小于num,则购买数量num=n
        n=n-num; //剩余购买量
        money=milk[i].price*num+money;//累计价格
        i++;
    }
    fout
<<money<<endl;
}
void quicksort(Milk milk[],int left,int right)
{
    
if(left<right)
    {
        
int s=milk[left].price;
        Milk sq
=milk[left];
        
int i=left+1;
        
int j=right;
        
while(true)
        {
            
while(milk[i].price<s&&i<right)
                i
++;
            
while(milk[j].price>s&&j>=0)
                j
--;
            
if(i>=j) break;
            Milk temp;
            temp
=milk[i];
            milk[i]
=milk[j];
            milk[j]
=temp;
            i
++;
            j
--;
        }
        milk[left]
=milk[j];
        milk[j]
=sq;
        quicksort(milk,left,j
-1);
        quicksort(milk,j
+1,right);
    }
}