考察:结构体排序+贪心策略+从单价高进行枚举要会的!
/*
题意:
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;
}
网友评论