前言
过年几天学习了一下贪心算法,趁着现在任务比较轻,多做几道贪心算法的题目巩固一下
题目
题目描述:
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;
}