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