题目描述
快餐牛奶公司从农民那里购买牛奶,将其包装成有吸引力的1和2单位瓶,然后将这种牛奶出售给杂货店,以便我们可以用美味的谷物和牛奶开始我们的一天。由于牛奶包装是如此难以赚钱的业务,所以保持成本尽可能低是很重要的。 帮助快餐牛奶厂以最便宜的方式购买农民的牛奶。 MMM公司拥有一个非常有才华的营销部门,每天都要知道他们需要多少牛奶来为客户打包。该公司与几家可以购买牛奶的农民签订合同,每个农民都有(可能)不同的价格,向包装厂出售牛奶。 当然,一群奶牛每天只能生产这么多的牛奶,所以农民们已经知道有多少牛奶可用了。每天,快餐奶机可以从每个农民那里购买一整数牛奶,这个数字总是小于或等于农民的限制(可能是农民的整个生产,没有一个生产,或任何 之间的整数)。
鉴于:
快餐牛奶的每日需求的牛奶
每个农民的牛奶每单位的成本
每个农民可用的牛奶量
计算出快餐牛奶制造商必须花费的最低金额才能满足他们日常的牛奶需求。
注意:农民每天生产的牛奶总是足以满足快餐牛奶制造商的要求,即使价格高。
每个农民的牛奶每单位的成本
每个农民可用的牛奶量
计算出快餐牛奶制造商必须花费的最低金额才能满足他们日常的牛奶需求。
注意:农民每天生产的牛奶总是足以满足快餐牛奶制造商的要求,即使价格高。
程序名称:milk
输入格式
行1:两个整数,N和M.
第一个值N(0 <= N <= 2,000,000)是Merry Milk Makers每天想要的牛奶量。
第二个,M(0 <= M <= 5,000)是他们可以从中购买的农民人数。
行2到M + 1:接下来的M行每行包含两个整数:Pi和Ai。
Pi(0 <= Pi <= 1,000)是我收取的农民的价格。
Ai(0 <= Ai <= 2,000,000)是我每天可以向Merry Milk Makers出售的牛奶的数量。
输入 (file milk.in)
100 5 5 20 9 40 3 10 8 80 6 30
输入说明
100 5 - MMM想要5个农民的100单位牛奶 5 20 - 农民1说:“我可以出售你20台,每单位5美分” 9 40等 3 10 - 农民3说:“我可以卖单位10美元,每单位3美分” 8 80等 6 30 - 农民5说:“我可以出售你30单位,每单位6美分”
输出格式
单行的数值是快餐牛奶制造商必须为一天的牛奶支付的最低成本。
输出(file milk.out)
630
输出说明
以下是MMM公司花费630美分购买100单位牛奶的方式:
每单位价格 | 可用单位 | 购买单位 | 价格*#单位 | 总成本 | 说明 |
---|---|---|---|---|---|
5 | 20 | 20 | 5*20 | 100 | |
9 | 40 | 0 | 从农民2没买到牛奶 | ||
3 | 10 | 10 | 3*10 | 30 | |
8 | 80 | 40 | 8*40 | 320 | 没有买到80个单位! |
6 | 30 | 30 | 6*30 | 180 | |
总计 | 180 | 100 | 630 | 最便宜的总成本 |
解题思路
本题主要思路是,通过几个农民买的牛奶价格从小到大进行排序,若价格相同则数量大的在前面。接着根据这个顺序挨个跟农民买奶,知道数量满,计算其总价。
解题代码
/*
ID: 15189822
PROG: milk
LANG: C++
*/
#include<iostream>
#include<fstream>
#include<cstdlib>
using namespace std;
const int N = 5000;
ifstream fin("milk.in");
ofstream fout("milk.out");
struct ll{
int pri,num;
}x[N+1];
int cmp(const void *a,const void *b){
struct ll *k1=(struct ll*)a;
struct ll *k2=(struct ll*)b;
if (k1->pri==k2->pri) return k1->num-k2->num;
return k1->pri-k2->pri;
}
int main(){
int i,n,m;
fin>>n>>m;
for (i=1;i<=m;i++){
fin>>x[i].pri>>x[i].num;
}
qsort(x+1,m,sizeof(x[0]),cmp);
int sum=0;
for (i=1;i<=m;i++){
int r=min(n,x[i].num);
sum+=r*x[i].pri;
n-=r;
if (n<=0) break;
}
fout<<sum<<endl;
return 0;
}