题目描述
牛奶包装是一个如此低利润的生意,所以尽可能低的控制初级产品(牛奶)的价格变的十分重要。请帮助Marry的牛奶制造公司(Merry Milk Makers')以可能的最廉价的方式取得他们所需的牛奶。Marry的牛奶制造公司从一些农民那购买牛奶,每个农民卖给牛奶制造公司的价格不一定相同。而且,如一只母牛一天只能生产一定量的牛奶,农民每一天只有一定量的牛奶可以卖。每天,Marry的牛奶制造公司从每个农民那购买一定量的牛奶,少于或等于农民所能提供的最大值。给出Marry牛奶制造公司的每日的牛奶需求,连同每个农民的可提供的牛奶量和每加仑的价格,请计算Marry的牛奶制造公司所要付出钱的最小值。 注意:每天农民生产的牛奶的总数对Marry的牛奶制造公司来说足够的。
输入
第 1 行:二个整数, N 和 M。 第一个数值,N,(0<= N<=2,000,000)是Marry的牛奶制造公司的一天需要牛奶的数量。 第二个数值,M,(0<= M<=5,000)是提供牛奶的农民个数。 第 2 到 M+1 行:每行二个整数,Pi 和 Ai。 Pi(0<= Pi<=1,000) 是农民 i 的牛奶的价格。 Ai(0 <= Ai <= 2,000,000)是农民 i 一天能卖给Marry的牛奶制造公司的牛奶数量。
输出
一个整数,表示Marry的牛奶制造公司拿到所需的牛奶所要的最小费用
样例输入
100 55 209 403 108 806 30
样例输出
630
来源
begin
readln(n,m); for i:=1 to m do readln(p[i],a[i]); qsort(1,m); s:=0; for i:=1 to m do begin if a[i]>n then k:=n else k:=a[i]; dec(n,k); inc(s,k*p[i]); if n=0 then break; end; writeln(s);end.
//冒泡排序解法
var m,n,i,j,t,c:longint; u,v:array[1..10000] of longint;begin readln(m,n); for i:=1 to n do read(u[i],v[i]); for i:=1 to n-1 do for j:=1 to n-i do if u[j]>u[j+1] then begin t:=u[j]; u[j]:=u[j+1]; u[j+1]:=t; t:=v[j]; v[j]:=v[j+1]; v[j+1]:=t; end; for i:=1 to n do begin if m<=v[i] then begin c:=c+m*u[i]; break; end; c:=c+u[i]*v[i]; m:=m-v[i]; end; writeln(c);end.
#include<cstdio>
#include<cstdlib>#include<cmath>#include<cstring>#include<string>#include<algorithm>using namespace std;struct farmer{ int p,a;};int cmp(farmer a,farmer b){return a.p<b.p;}int main(){
freopen("milk.in","r",stdin); freopen("milk.out","w",stdout); int need,i,n,ans=0; farmer a[5010]; scanf("%d%d",&need,&n); for(int i=0; i<n; i++)scanf("%d%d",&a[i].p,&a[i].a); sort(a, a+n, cmp); for(i=0;i<n;i++){ if(need<=0)break; if(a[i].a<=need){ans+=a[i].p*a[i].a; need-=a[i].a;} else{ans+=a[i].p*need; need=0;} } printf("%d\n",ans); return 0;}
var i,m,n,x:longint;
a,p:array[0..5010] of longint;procedure BUB;var i,j,t:longint;begin for i:=1 to n-1 do for j:=1 to n-i do if a[j]>a[j+1] then begin t:=a[j]; a[j]:=a[j+1]; a[j+1]:=t; t:=p[j]; p[j]:=p[j+1]; p[j+1]:=t; end;end;begin readln(m,n);x:=0; for i:=1 to n do read(a[i],p[i]); BUB; for i:=1 to n do begin if m<=0 then break; if p[i]<=m then x:=x+p[i]*a[i] else x:=x+m*a[i]; m:=m-p[i]; end; writeln(x);end.