在计算单价时,会产生小数误差,所以所有数字类型都定义为double,否则会有测试点答案错误
#include <iostream>
#include <algorithm>
#include <stdio.h>
using namespace std;
struct Goods
{
double num; //库存量
double total_price; //总售价
double unit_price; //单位售价(万吨)
};
bool cmp(struct Goods g1,struct Goods g2)
{
return g1.unit_price>g2.unit_price; //按单位售价(万吨)降序排列
}
int main(int argc, char const *argv[])
{
int N;
double D; //最大需求量
double maxPrice=0.00;
cin >> N >> D;
struct Goods goods[N];
for(int i=0;i<N;i++)
cin >> goods[i].num; //输入库存量
for(int i=0;i<N;i++)
{
cin >> goods[i].total_price; //输入每种货物的总售价
goods[i].unit_price=goods[i].total_price/goods[i].num; //计算单位售价
}
sort(goods,goods+N,cmp); //按单位售价(万吨)降序排列
int k=0; //记录当前的月饼编号,因为按单位售价递减排序,所以k为当前单位售价最高的月饼
while(D&&k<=N) //当最大需求量为0时,即表示最大需求量都已售完,则退出循环
//如果k>N,则表示当前月饼种类 > 实际月饼种类,即月饼已全部销售完毕,但未完成最大需求量
{
if(goods[k].num<=D) //如果当前k的最大单位售价的月饼库存量 <= 当前的最大需求量D
{
maxPrice+=goods[k].total_price; //则当前最大收益+该月饼的总售价
D-=goods[k].num; //最大需求量=最大需求量-该月饼的库存量
k++; //k指向下一个最大单位售价的月饼
}
else //当前k的最大单位售价的月饼库存量 >当前的最大需求量D
{
maxPrice+=D*goods[k].unit_price; //则最大收益+当前需求量*当前月饼的单位售价
D=0; //z最大需求量为0
}
}
printf("%.2lf\n",maxPrice);
return 0;
}