摘要

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

题意

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

题解

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

代码

1009.cpp代码已折叠
展开折叠内容
#include<cstdio>
#include<iomanip>
#include<algorithm>
using namespace std;
class trade{
    public:
    double require,provide;
    friend bool operator <(const trade &a,const trade &b)
    {
        return a.provide/a.require>b.provide/b.require;
    }
    bool Trade(double &M,double &ans)
    {
        if(M>=require&&provide>require)
        {
           M-=require;
           ans+=provide;
           return 1;
        }else{
            ans+=M/require*provide;
            M=0;
            return 0;
        }
    }
} p[1000];
int main()
{
    while(1)
    {
        int n;
        double m,a,b,ans=0;
        scanf("%lf%d",&m,&n);
        if(n<-.5&&m<-.5)
            return 0;
        for(int i=1;i<=n;++i)
            scanf("%lf%lf",&p[i].provide,&p[i].require);
        sort(p+1,p+n+1);
        for(int i=1;i<=n;++i)
        {
            if(!p[i].Trade(m,ans))
                break;
        }
       printf("%.3lf\n",ans);
    }
}

著作权声明[编辑]

关于[编辑]