当前位置: 首页 > 工具软件 > Famo.us > 使用案例 >

FatMouse

聂涛
2023-12-01

前言

过年几天学习了一下贪心算法,趁着现在任务比较轻,多做几道贪心算法的题目巩固一下

题目

题目描述:
FatMouse prepared M pounds of cat food, ready to trade with the cats guarding the warehouse containing his favorite food, JavaBean.
The warehouse has N rooms. The i-th room contains J[i] pounds of JavaBeans and requires F[i] pounds of cat food. FatMouse does not have to trade for all the JavaBeans in the room, instead, he may get J[i]* a% pounds of JavaBeans if he pays F[i]* a% pounds of cat food. Here a is a real number. Now he is assigning this homework to you: tell him the maximum amount of JavaBeans 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 J[i] and F[i] respectively. The last test case is followed by two -1's. 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 JavaBeans 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

思路

典型的贪心算法题目,优先选择J[I]/F[I]大的仓库,总共的M猫粮是竞争的公共资源

AC代码

#include <stdio.h>
#include <stdlib.h>
#define max 1001

struct warehouse
{
	double j, f;
};

int compare(const void *a, const void *b);

int main()
{
	int m, n, i;
	double jb;
	struct warehouse wh[max];

	while(scanf("%d %d", &m, &n) != EOF && (m != -1 && n != -1))
	{
		for(i = 0; i < n; i ++)
		{
			scanf("%lf %lf", &wh[i].j, &wh[i].f);
		}

		//按j[i]/f[i]排序
		qsort(wh, n, sizeof(wh[0]), compare);

		//贪心选择
		for(i = 0, jb = 0.000; i < n; i ++)
		{
			if(m > 0)
			{
				if(m > wh[i].f)
				{
					jb += wh[i].j;
					m -= wh[i].f;
				}else
				{
					jb += m * wh[i]. j / wh[i].f;
					m = 0;	
				}
			}else
			{
				break;
			}
		}

		//打印输出
		printf("%.3lf\n", jb);
	}

	return 0;
}

int compare(const void *a, const void *b)
{
	const struct warehouse *p = a;
	const struct warehouse *q = b;

	return (p->j * q->f - p->f * q->j) * -1;
}



 类似资料:

相关阅读

相关文章

相关问答