老鼠与猫的交易(啦啦啦啦啦啦啦啦啦

友链

题目

有一只老鼠很喜欢奶酪,但是奶酪被分别放在N个房间里,而且这些房间都有一只猫咪看守,现
在它准备和猫咪们做个交易。它有M磅的猫食,想用这M磅猫食换取奶酪。在猫咪看守的每一个
房间里有奶酪J[i]磅,同时猫咪需要F[i]磅的食物,如果老师给猫咪F[i]*a%的猫食,那么它就可以
得到J[i]*a%的奶酪。现在已知每只猫咪对猫食的需求量和每个房间的奶酪数,那老鼠怎样才能
换得最多的奶酪呢?

样例输入
5 3
7 2
4 3
5 2
样例输出
13.333

首先,看到这题,第一反应,贪心。。。
贪心策略:首先,我们可以算出,当a[i].j(即奶酪)最小,a[i].f(即猫食)最大的时候,最佳,所以我们只需要来一个a[i].ans(double类型)来储存a[i].f/a[i].j,在通过排序排出a[i].ans的最大的值就行了。。。

#include<cstdio>
#include<algorithm>
using namespace std;
struct zz{
	int f,j;
	double ans;
}a[100005];
bool cmp(zz x,zz y){
	if(x.ans<y.ans)
		return 0;
	return 1;
}
int main(){
	int m,n;
	scanf("%d%d",&m,&n);
	for(int i=1;i<=n;i++){
		scanf("%d%d",&a[i].f,&a[i].j);
		a[i].ans=1.0*a[i].f/a[i].j;
	}
	sort(a+1,a+n+1,cmp);
	double sum=0;
	for(int i=1;i<=n;i++){
		if(m>=a[i].j){
			m-=a[i].j;
			sum+=a[i].f;
		}
		else{
			double ss=1.0*m/a[i].j;
			sum+=1.0*a[i].f*ss;
			break;
		}
	}
	printf("%.3lf",sum);
} 

猜你喜欢

转载自blog.csdn.net/xf2056188203/article/details/107155801