1020 月饼 (25分)

2020-01-31  本文已影响0人  km15

考察:结构体排序+贪心策略+从单价高进行枚举要会的!

/*
题意:
1、给出库存量,总售价,(有好几种),市场需求量
求出策略赚最多钱——贪心策略
种类不超过1000,不超过500万吨

编程思想:
1、应该先开两个数组,输出库存量,总售价,计算出单价,
2、这时候应该判断了,如果当前最多钱的能够覆盖住掉需求量,就覆盖掉并且清除掉覆盖量
如果不能,则money累加,减去库存量,累加下一个,
也有可能3个都累加

learn && wrong:
1、如何削减库存量呢->枚举,加到利润上去,减去库存量,需求没有库存量多,直接成单价break出来
2、它是结构来的,所以排列就按单价来排列,不像我,没法排列
3、库存量和总售价记得是double,利润记得也是double
4、总需求也要是double!因为后面会减去库存量,
总结:记住这类实际问题,可能需要double
*/

#include <iostream>
#include <algorithm>
using namespace std;

const int maxn = 1010;
struct mooncake {
    double price;  //单价  //单价,这三个也必须是double
    double sell;  //总售价
    double store; //坤存量
}cake[maxn];

bool cmp(mooncake a, mooncake b) {
    return a.price > b.price;
}

int main(int argc, char** argv) {
    int zhognlei;double xuqiu;  //需求也必须是double
    cin >> zhognlei >> xuqiu;
    for (int i = 0;i < zhognlei;++i) {
        cin >> cake[i].store;
    }
    
    for (int i = 0;i < zhognlei;++i) {
        cin >> cake[i].sell;
        cake[i].price = cake[i].sell / cake[i].store;
    }

    sort(cake, cake + zhognlei, cmp);

    double lirun = 0;
    for (int i = 0;i < zhognlei;++i) {
        if (cake[i].store <= xuqiu) { 
            lirun += cake[i].sell;
            xuqiu -= cake[i].store;
        }
        else {
            lirun += cake[i].price * xuqiu; //(!!!)还库存减需求,直接乘需求啊!
            break;
        }
    }

    printf("%.2lf\n",lirun);
    return 0;
}
上一篇下一篇

猜你喜欢

热点阅读