题目描述

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

输入格式

第一行输入两个正整数M和N(M和N不大于10000),后面跟N行(每个房间的奶酪数和猫食的需求量)。

输出格式
输出老鼠得到的最多的奶酪数,保留三位小数。

样例
样例1输入
5 3
7 2
4 3
5 2
样例1输出
13.333
样例2输入
20 3
25 18
24 15
15 10
样例2输出
31.500

分析

典型的贪心,一道性价比问题,即需要在有限的总钱数下得到更高价格的商品,在输入时求出物价,并按从高到低排序即可。

具体实现

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 10005; 

struct node{
	double j, f, p;//定义成double更方便
};
node a[MAXN];
int n, m;
double ans;

bool cmp(node x, node y) {//按性价比从搞到低排序
	return x.p > y.p;	
}

int main() {
	scanf("%d %d", &m, &n);
	for(int i = 1;i <= n; i++) {
		scanf("%lf %lf", &a[i].j, &a[i].f);
		a[i].p = a[i].j / a[i].f;//求性价比
	}
	sort(a + 1, a + 1 + n, cmp);
	for(int i = 1;i <= n; i++) {//统计
		if(m >= a[i].f) {//如果奶酪没有用完
			m -= a[i].f;
			ans += a[i].j;
		} else {
			ans += a[i].p * m;
			break;
		}
	}
	printf("%.3lf\n", ans);
	return 0;
}