1020 月饼(25 分)
#include<iostream>
#include<algorithm>//sort
#include<vector>
using namespace std;
struct stu{
double a,b,c;
};
//return a>b 表示降序,return a<b表示升序
bool cmp(stu a1,stu b1){
return a1.c>b1.c;
}
int main()
{
int n,d;
cin>>n>>d;
double a[1000],b[1000];//a 库存量 b总售价
double c[1000],result=0;//c 平均价格
//////////////////////////////////////////////////
///*
//将库存 总售价 平均价格录入向量v1的方法1
stu tmp;
vector<stu> v1,v;
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<n;i++) cin>>b[i];
for(int i=0;i<n;i++) c[i]=b[i]/a[i];
for(int i=0;i<n;i++){
tmp.a=a[i];
tmp.b=b[i];
tmp.c=c[i];
v1.push_back(tmp);
}
v=v1;
//*/
////////////////////////////////////////////////////////
/*
//将库存 总售价 平均价格录入向量v2的方法2
vector<stu> v2(n),v(n); //(n)不能省略 否则是段错误
for(int i=0;i<n;i++) cin>>v2[i].a;
for(int i=0;i<n;i++) cin>>v2[i].b;
for(int i=0;i<n;i++) v2[i].c=v2[i].b/v2[i].a;
v=v2;
*/
//////////////////////////////////////////////////////
sort(v.begin(),v.end(),cmp);
double sum=0;
int k=0;
////////////////////////////////////////////////////
//第一种判断方式
for(int i=0;sum<d&&i<n;i++){
result = v[i].b+result; ///result = b[i]+result; 之前的错误原因代码 需要在向量v中按照顺序提取b[i],而不是从初始顺序里面提取b[i]
sum +=v[i].a; //sum +=a[i];
k++;
}
if(sum>=d)
result = result -(sum-d)*v[k-1].c; //result = result -(sum-d)*c[k-1];
///////////////////////////////////////////////////
//第二种判断方式
/*
for(int i=0;i<n&&d!=0;i++)
{
if(d>=v[i].a)
{
result+=v[i].b;
d-=v[i].a;
}
else
{
result+=v[i].c*d;
break;
}
}
*/
///////////////////////////////////////////
printf("%.2f",result);
return 0;
}