PAT(Basic Level) Practice : 1020 月饼 (25分)
1020 月饼 (25分)
注意:
double类型多次乘除过后可能会有微小差异
如果是把每种月饼单价都求出来,再乘以库存,最后加起来,会导致第三个测试点不能通过
举个例子:
double a=90;
double b=a/15;
double c=b*15;
c不一定是90,可能是90.0001或者89.9999
解决
如果需求量>库存,直接加上给出的总价,而不要用算出来的单价*总数。
代码
#include <iostream>
#include"stdlib.h"
#include <vector>
#include <cstdio>
#include <algorithm>
#include <sstream>
using namespace std;
#include<iomanip>
class mooncake
{
public:
double stock;
double price;
double all_price;
mooncake()
{
stock=0;
price=0;
all_price=0;
}
};
bool compare(mooncake m1,mooncake m2)
{
return m1.price>m2.price;
}
int main()
{
int num,demand;
cin>>num>>demand;
vector<mooncake> mcake;
for(int i=0;i<num;i++)
{
mooncake m1;
cin>>m1.stock;
mcake.push_back(m1);
}
for(int i=0;i<num;i++)
{
double temp;
cin>>temp;
mcake[i].all_price=temp;
mcake[i].price=temp/mcake[i].stock;
}
sort(mcake.begin(),mcake.end(),compare);
double sum=0;
for(int i=0;i<num;i++)
{
if(demand==0)
break;
if(demand>=mcake[i].stock)
{
sum+=mcake[i].all_price;
demand-=mcake[i].stock;
}else{
sum+=demand*mcake[i].price;
demand=0;
}
}
cout.setf(ios::fixed);
cout<<setprecision(2)<<sum<<endl;
return 0;
}