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
posted @ 2022-10-03 13:22  Euouae  阅读(24)  评论(0编辑  收藏  举报