原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1009
题目大意:老鼠想要用n个猫粮在m个房间中换取自己想要的食物。在第i个房间中用f[i]个猫粮可换取j[i]个食物,要求用n个猫粮在这m个房间中换取最多的食物。
解题思路:每个房间都有一个兑换率j[i]/f[i],将所有的房间按兑换率从大到小排序,最后在从前往后兑换,直到n个猫粮用完。
代码如下:
#include<cstdio> #include<algorithm> using namespace std; typedef struct node { double x,y; }node; node p[1002]; bool ab(node a,node b) { node c; c.x=a.x/a.y; c.y=b.x/b.y; if(c.x>=c.y) return true; else return false; } int main() { int n,m,i; double sum,s; while(scanf("%d%d",&n,&m)!=EOF&&(n!=-1||m!=-1)) { for(i=0;i<m;i++) scanf("%lf%lf",&p[i].x,&p[i].y); sort(p,p+m,ab);//按兑换率从大到小排序,即按函数ab排序 s=n; for(sum=0.0,i=0;i<m;i++) { if(s>=p[i].y)//如果现有猫粮大于等于该房间需要猫粮则可兑换相应的食物更新现有猫粮 { sum+=p[i].x; s=s-p[i].y; } else //如果现有猫粮少于需要猫粮,则每颗只能兑换p[i].x/p[i].y,
//本次可兑换(p[i].x/p[i].y)*s个食物,猫粮在该次已经兑换完,结束 { sum+=(p[i].x/p[i].y)*s; break; } } printf("%.3lf\n",sum); } return 0; }