HDU 1009 FatMouse' Trade(贪心)

来源:互联网 发布:搜图神器软件 编辑:程序博客网 时间:2024/05/16 06:09




http://acm.hdu.edu.cn/showproblem.php?pid=1009






题目大意:

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

   

分析:  

老鼠要用最少的猫粮来换取最多的食物  也就是J[i]/F[i]越大越好   所以按照J[i]/F[i]进行降序排列  然后依次用猫粮来 换取食物   当所剩下的猫粮不足以完全换取食物  能换多少是多少就用  剩下的猫粮  *  (J[i]/F[i]





AC代码:

#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;struct node{//      结构体来存储 j f 和 j/f double j;double f;double s;}a[1005];int cmp(node x,node y){return x.s>y.s;} int main (){int M,N;while (scanf("%d%d",&M,&N)&&(M!=-1&&N!=-1)){memset(a,0,sizeof(a));for (int i=0;i<N;i++){scanf ("%lf%lf",&a[i].j,&a[i].f);a[i].s=a[i].j/a[i].f*1.0;}sort(a,a+N,cmp);double sum=0.0;for (int i=0;i<N;i++){if(M>=a[i].f){sum+=a[i].j;M-=a[i].f;}else{sum+=M*a[i].s;M=0;} if (M<=0){break;}}printf ("%.3lf\n",sum);}return 0;}