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 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.
5 3 7 2 4 3 5 2 20 3 25 18 24 15 15 10 -1 -1
13.333 31.500
这是一道假贪心:老鼠有m磅猫食,然后有n个房子,每个房子有j磅老鼠的食物,需要用f磅猫食换,如果不够,可以按比例得到,思路:只需要把比例算一下,按从大到小排序就可以算出来。
#include<iostream> #include<algorithm> #include<cstdio> using namespace std; struct node { int j; int f; double value; //得到的食物和所需食物的比例 }num[1001]; bool cmp(node x,node y) { return x.value>y.value; } int main() { int m,n,i; double sum; while(cin>>m>>n) { sum=0; if(m==-1&&n==-1) { break; } for(i=0;i<n;i++) { cin>>num[i].j>>num[i].f; num[i].value=1.0*num[i].j/num[i].f; } sort(num,num+n,cmp); i=0; while(m>0) { if(i==n) { break; } if(m>=num[i].f) { m-=num[i].f; sum+=num[i].j; i+=1; } else { sum+=m*num[i].value; m=0; i+=1; } } printf("%.3lf\n",sum); } }