USACO Training Section 1.3 Mixing Milk
简化题意
二个整数 \(n\),\(m\),表示需要牛奶的总量,和提供牛奶的农民个数。
每行两个整数 \(p_i\),\(a_i\),表示第\(i\)个农民牛奶的单价,和农民\(i\)一天最多能卖出的牛奶量。
现在我们要求的是用最少的钱去完成这个\(n\)的牛奶产量
分析与解答
我们将牛奶的总量的单价从小到大排序
\[if(p[j]<p[j-1]){b=1;swap(a[j],a[j-1]),swap(p[j],p[j-1]);}
\]
这里我们采用冒泡排序
代码:
//(water problem)
#include<bits/stdc++.h>
//#pragma GCC optimize (3)
using namespace std;
int main()
{
int n,m;cin>>n>>m;int p[5005],a[5005];a[m]=INT_MAX;
for(register int i=0;i<5005;i++) p[i]=a[i]=0;
for(register int i=0;i<m;i++) cin>>p[i]>>a[i];
for(register int i=0;i<m;i++){
int b=0;for(register int j=m-1;j>i;j--){
if(p[j]<p[j-1]){b=1;swap(a[j],a[j-1]),swap(p[j],p[j-1]);}
}
if(b==0) break;
}
//for(register int i=1;i<=m;i++) cout<<p[i]<<' '<<a[i]<<endl;
int x=0,q=0,f=0;while(x<n){
x+=a[f];q+=a[f]*p[f];f++;
//cout<<q<<endl;
}
cout<<q-(x-n)*p[f-1];
return 0;
}
//by Euouae