問題描述 :
牛奶包裝是一個如此低利潤的生意,所以儘可能低的控制初級產品(牛奶)的價格變得十分重要。請幫助快樂的牛奶製造者(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
c源碼:
#include<stdio.h>
int main()
{
int i,j,N,M,n,m,a[2][5000],s,p,t;
while(scanf("%d%d",&N,&M)!=EOF)
{ memset(a,0,5000);
for(i=0;i<M;i++)
scanf("%d%d",&a[0][i],&a[1][i]);
for(i=0;i<M;i++)
for(j=0;j<M-i-1;j++)
if(a[0][j]>a[0][j+1])
{
n=a[0][j];
m=a[1][j];
a[0][j]=a[0][j+1];
a[1][j]=a[1][j+1];
a[0][j+1]=n;
a[1][j+1]=m;
}
s=0;
p=0;
for(i=0;i<M;i++)
{
if(s==N)
break;
if((s+a[1][i])<=N)
{
s=s+a[1][i];
p=p+a[1][i]*a[0][i];
}
else
{
t=N-s;
s=N;
p=p+t*a[0][i];
}
}
printf("%d\n",p);
}
return 0;
}