Description
小毛准备了M磅的猫咪食物去和猫咪交易他最喜欢的食物爪哇豆。猫咪有N间仓库,其中第i间仓库包含着s[i]磅的爪哇豆,但要花费f[i]磅的猫咪食物去和他们交换。小毛很聪明,经过他的各种交换,发现自已没有必要把每一个仓库的食物全部买下,他可以偷偷地买下一部分。也就是说,他可以获得s[i]*a%磅的爪哇豆而只花费f[i]*a%磅的猫咪食物。但是,他不知道该怎么买才能买到最多的爪哇豆。请帮他计算一下。
Input
第1行2个整数M和N,中间用一个空格隔开。
接下来的N行,每行2个非负整数S[i]和F[i],中间用一个空格隔开。
其中,所有整数不超过1000
Output
一行一个实数,精确到小数点后三位,表示小毛最多能买到多少磅的爪哇豆。
Sample Input
5 3
7 2
4 3
5 2
Sample Output
13.333
HINT
s[i]*a%中的“%”是指“百分号”
物品可以分割,按性价比贪心.
#include <iostream>
#include <algorithm>
#define SIZE 1001
using namespace std;
struct node
{
int s, f;
double r;
};
node a[SIZE];
bool comp(node a, node b) // 排序比较函数
{
return a.r > b.r;
}
int main(void)
{
int m, n, i;
double res = 0;
scanf("%d%d", &m, &n);
for (i = 1; i <= n; ++i)
{
scanf("%d%d", &a[i].s, &a[i].f);
a[i].r = a[i].s / double (a[i].f); // 性价比
}
sort(a + 1, a + n + 1, comp); // 按性价比排序
for (i = 1; i <= n; ++i) // 这里就直接贪心了
{
if (m >= a[i].f) // 能装得下
{
m -= a[i].f;
res += a[i].s;
}
else // 只能装一部分
{
res += a[i].s * m / double (a[i].f);
break;
}
}
printf("%.3f", res);
return 0;
}