zoukankan      html  css  js  c++  java
  • 1020 月饼 (25分)

    1. 这里采用“总是选择单价最高的月饼出售,可以获得最大的利润”的策略。因此,对每种月饼,都根据其库存量和总售价来计算出该种月饼的单价。之后,将所有月饼按单价从高到低排序。
    2. 从单价高的月饼开始枚举。
      1. 如果该种月饼的库存量不足以填补所有需求量,则将该种月饼全部卖出,此时需求量减少该种月饼的库存量大小,收益值增加该种月饼的总售价大小。
      2. 如果该种月饼的库存量足够供应需求量,则只提供需求量大小的月饼,此时收益值增加当前需求量乘以该种月饼的单价,而需求量减为0。这样,最后得到的收益值即为所求的最大收益值。

    策略正确性的证明:假设有两种单价不同的月饼,其单价分别为a和b (a<b)。如果当前需求量为K,那么两种月饼的总收入分别为aK与bK,而aK < bK显然成立,因此需要出售单价更高的月饼。

    ps:月饼库存量和总售价可以是浮点数(题目中只说是正数,没说是正整数),需要用double型存储。对于,总需求量D虽然题目说是正整数,但是为了后面计算方便,也需要定义为浮点型。

    const int N=1010;
    PDD a[N];
    int n;
    double m;
    
    bool cmp(PDD &a,PDD &b)
    {
        return a.se/a.fi > b.se/b.fi;
    }
    
    int main()
    {
        cin>>n>>m;
    
        for(int i=0;i<n;i++) cin>>a[i].fi;
        for(int i=0;i<n;i++) cin>>a[i].se;
    
        sort(a,a+n,cmp);
    
        double res=0;
        for(int i=0;i<n;i++)
        {
    
            if(m >= a[i].fi) res+=a[i].se, m-=a[i].fi;
            else 
            {
                res+=a[i].se/a[i].fi*m, m=0;
                break;
            }
        }
    
        printf("%.2f
    ",res);
        //system("pause");
        return 0;
    }
    
  • 相关阅读:
    C语言C++编程学习:排序原理分析
    Ubuntu下开机进程管理工具sysvrcconf
    康托展开
    USACO 3.2 Magic Squares题解
    『转』ubuntu的电池管理
    poj1061青蛙的约会解题报告
    Dancing Links
    【转】史上最强vim配置文件vimrc
    四柱汉诺塔
    又遇欧拉 转载之
  • 原文地址:https://www.cnblogs.com/fxh0707/p/14337717.html
Copyright © 2011-2022 走看看