YX杭电oj 1008

FatMouse' Trade

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 33442    Accepted Submission(s): 10862


Problem Description
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.
 

Input
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.
 

Output
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.
 

Sample Input
 
 
5 3 7 2 4 3 5 2 20 3 25 18 24 15 15 10 -1 -1
 

Sample Output
 
 
13.333 31.500
AC代码+详细解释:

   
   
  1. #include<iostream>//贪心
  2. #include<cstdio>//题目意思:FatMouse老鼠用m克猫粮和猫兑换自己喜欢的食物,但是老鼠喜欢的食物在许多仓库并且每层仓库的兑换率都不相同但是每层的兑换率是J[i]克猫粮兑F[i]食物(i是层数)
  3. #include<cstring>
  4. const int MAX= 10001;
  5. int J[MAX];
  6. int F[MAX];
  7. double p[MAX];
  8. using namespace std;
  9. int main()
  10. {
  11. int n,m,i,j;
  12. double sum;
  13. while( cin>>m>>n&&(m!= -1&&n!= -1))
  14. {
  15. for(i= 1;i<=n;i++)
  16. {
  17. cin>>J[i]>>F[i];
  18. p[i]= double(J[i])/F[i]; //每层兑换率
  19. }
  20. sum= 0;
  21. while(m!= 0&&n!= 0) //当猫粮为0或者食物为0时跳出循环
  22. {
  23. int k;
  24. double Max= -1;
  25. for(i= 1;i<=n;i++) //每次挑选兑率最大的层数(房间)
  26. {
  27. if(p[i]>Max)
  28. {
  29. Max=p[i];
  30. k=i;
  31. }
  32. }
  33. if(m-F[k]>= 0) //如果猫粮有剩余或者刚好
  34. {
  35. m-=F[k]; //减去需要的猫粮
  36. sum+=J[k]; //加上兑换到的食物
  37. p[k]= 0; //该层的兑率为0即兑换完了-没有了
  38. }
  39. else //如果猫粮不够的话,就用剩下的猫粮全部去兑换食物
  40. {
  41. sum+=p[k]*m; //全部兑换食物
  42. m= 0; //使猫粮为0,兑换完毕-跳出循环
  43. }
  44. }
  45. printf( "%.3lf\n",sum); //输出
  46. }
  47. return 0;
  48. }


 
转载自(https://blog.csdn.net/ecjtu_yuweiwei/article/details/9427885)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值