题目地址
解题思路
每一种月饼都有自己的库存num、总价sumprice,用结构体数组来表示这一系列月饼比开多个数组可读性高。
涉及单价的排序,故在结构体中加入单价price,便于对比排序。
用vector来存放结构体数组p。
按单价从高到低的顺序取库存,直到填满市场需求量。
注:在循环取库存过程中,由于涉及到浮点运算,故使用p[j].num * p[j].price来表示p[j].sumprice会出错。
AC代码如下:
#include <iostream>
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <iomanip>
using namespace std;
struct mooncake{
int num;
int sumprice;
double price;
};
/* sort比较函数,单价高的排在前 */
bool cmp( mooncake a,mooncake b ){
return a.price>b.price;
}
int main()
{
int n,d;
scanf("%d%d",&n,&d);
vector<mooncake> p(n);//定义容器数组p(此处用指针会出错)
for( int i=0;i<n;++i ){
scanf("%d",&p[i].num);
}
for( int i=0;i<n;++i ){
scanf("%d",&p[i].sumprice);
p[i].price = double(p[i].sumprice) / double(p[i].num);
}
sort( p.begin(),p.end(),cmp );
double sum=0;
for( int j=0;j<n;++j ){
if( p[j].num>=d ){//库存量够取出需要的库存,结束循环
sum += d * p[j].price;
break;
}
else{//库存量不够时取出全部库存,然后到下一个库中取货
d -= p[j].num;
sum += p[j].sumprice;/*!!!bug所在!!!*/
}
}
/* C++保留2位小数 */
cout<<setiosflags(ios::fixed)<<setprecision(2)<<sum;
return 0;
}