nyoj 824 Greedy Mouse

本文介绍了一道关于贪心算法的经典问题——利用有限的猫粮交换仓库中花生的最大数量。通过具体实例展示了如何计算不同房间的交换比率,并按比率从高到低排序进行交易以获得最多花生。

题目信息:

Greedy Mouse

时间限制:1000 ms  |  内存限制:65535 KB
难度:3
描述

A fat mouse prepared M pounds of cat food,ready to trade with the cats guarding the warehouse containing his

favorite food:peanut. The warehouse has N rooms.The ith room containsW[i] pounds of peanut and requires 

F[i] pounds of cat food. Fatmouse does not have to trade for all the peanut in the room,instead,he may get 

 W[i]*a% pounds of peanut if he pays F[i]*a% pounds of cat food.The mouse is a stupid mouse,so can you tell 

him the maximum amount of peanut he can obtain.

输入
The input consists of multiple test cases. Each test case begins with a line containing two non-negative integers M and N. Then N lines follow, each contains two non-negative integers W[i] and F[i] respectively. The test case is terminated by two -1. All integers are not greater than 1000.
输出
For each test case, print in a single line a real number accurate up to 3 decimal places, which is the maximum amount of penaut that FatMouse can obtain.
样例输入
5 3
7 2
4 3
5 2
20 3
25 18
24 15
15 10
-1 -1
样例输出
13.333
31.500

此题为经典的贪心算法题:

AC代码:

# include <stdio.h>
# include <algorithm>

using namespace std;

struct TRADE
{
	int pea;
	int cat;
	double ex;
};

TRADE tad[1010];

int cmp(TRADE a, TRADE b)
{
	return a.ex > b.ex;
}
int main(void)
{
	int m, n; // m是房间数, n是猫粮磅数
	while (scanf("%d %d", &n, &m), m != -1 || n != -1)
	{
		int i;
		for (i = 0; i < m; i++)
		{
			scanf("%d %d", &tad[i].pea, &tad[i].cat);
			tad[i].ex = 1.0 * tad[i].pea / tad[i].cat;
		}
		sort(tad, tad+m, cmp);//因为此处, WA了4次, 原因:错把n当成m
		double sum = 0.0;
		for (i = 0; i < m; i++)
		{
			if (n  >= tad[i].cat)
			{
				sum += tad[i].pea;
				n -= tad[i].cat;
			}
			else
			{
				sum +=  n * tad[i].ex;
				break;
			}

		}
		printf("%.3lf\n", sum);
	}
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值