问题描述(译 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);
}
}