hdu-1009 FatMouse' Trade(贪心算法)

题目大意:

老鼠有M磅猫食。有N个房间,每个房间前有一只猫,房间里有老鼠最喜欢的食品JavaBean,J[i]。若要引开猫,必须付出相应的猫食F[i]。当然这只老鼠没必要每次都付出所有的F[i]。若它付出F[i]a%,则得到J[i]a%。求老鼠能吃到的做多的JavaBean

解题思路:

老鼠要获得最多的食品,就要用最小的猫食换取最多的猫食,这就要求J[i]/F[i]的比例要大。J[i]/F[i]的比例越大,证明在这个房间,小鼠付出得到的收获最有价值。于是我们将设置结构体,结构体里设置percent放置J[i]/F[i]。然后对结构体数组进行排序。依次按比例排序的付出猫食,即可。

例子:

输入

5 3

7 2

4 3

5 2

J[i]/F[i]排序后:

7 2

5 2

4 3

在第一排数据上,小鼠付出2个猫食换得7JavaBean

在第二排数据上,小鼠付出2个猫食换得5JavaBean

在第三排数据上,小鼠只剩下1个猫食,便用这一个猫食换取1/3*4JavaBean

所以,总共换得13.333JavaBan


#include <stdio.h>
#include <algorithm>
using namespace std;
struct Trade {
	int j, f;
	double percent;
} mouse[3001];
bool cmp(Trade a, Trade b)
{
	return a.percent > b.percent;
}
int main(void)
{
	int n, m;
	while(scanf("%d%d", &m, &n)!=EOF && (m!= -1 || n != -1))
	{
		int i;
		
		for(i = 0; i < n; i++)// 输入数据 
		{
			scanf("%d %d", &mouse[i].j, &mouse[i].f);
			mouse[i].percent = (double)mouse[i].j / mouse[i].f;
		}
		sort(mouse, mouse + n, cmp);
		double sum = 0; // 换得的javaBean之和 
		
		for(i = 0; i < n; i++)
		{
			if(m > mouse[i].f)// m是手中的猫食 
			{
				sum += mouse[i].j;// 换得的javaBean之和
				m -= mouse[i].f;// 减去所需要的猫食 
			}
			else
			{
				sum += mouse[i].percent * m;
				m = 0;
				break;
			}
		}
		printf("%.3lf\n", sum);
	}
	
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值