摘要

题目链接 难度等级 完成状态 完成分数 最后编辑时间 失误原因(初次提交分数)
FatMouse' Trade ★☆☆☆☆ 答案正确 100 2015-02-06 13:49:23 输入超时(0)

题意

初始m金钱,给出n个交易,分别是用Ji金钱换取Fi商品,问最终能获得的最大商品数量(商品可无限分割),即部分背包问题。

题解

  • 贪心,按性价比排序,从高到低尽量多拿即可。
  • cin/cout会超时……

代码

1009.cpp代码已折叠
展开折叠内容
显示/移除行号
  1. #include<cstdio>
  2. #include<iomanip>
  3. #include<algorithm>
  4. using namespace std;
  5. class trade{
  6. public:
  7. double require,provide;
  8. friend bool operator <(const trade &a,const trade &b)
  9. {
  10. return a.provide/a.require>b.provide/b.require;
  11. }
  12. bool Trade(double &M,double &ans)
  13. {
  14. if(M>=require&&provide>require)
  15. {
  16. M-=require;
  17. ans+=provide;
  18. return 1;
  19. }else{
  20. ans+=M/require*provide;
  21. M=0;
  22. return 0;
  23. }
  24. }
  25. } p[1000];
  26. int main()
  27. {
  28. while(1)
  29. {
  30. int n;
  31. double m,a,b,ans=0;
  32. scanf("%lf%d",&m,&n);
  33. if(n<-.5&&m<-.5)
  34. return 0;
  35. for(int i=1;i<=n;++i)
  36. scanf("%lf%lf",&p[i].provide,&p[i].require);
  37. sort(p+1,p+n+1);
  38. for(int i=1;i<=n;++i)
  39. {
  40. if(!p[i].Trade(m,ans))
  41. break;
  42. }
  43. printf("%.3lf\n",ans);
  44. }
  45. }

著作权声明[编辑]

关于[编辑]