#131-(EZOI练习)[贪心]小毛的交易

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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值