题目描述
有一只老鼠很喜欢奶酪,但是奶酪被分别放在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
", ans);
return 0;
}