map根据value排序需要自定义比较函数(cmp),然后利用vector容器可以sort排序的原理
具体例子如下:
这道题需要用到简单的贪心,及每次都购买单价最高的月饼,这道题要注意;以下几点:
1、注意带一定精度的除法或者乘法运算(double)
2、自定义cmp函数用作sort
3、熟悉map(底层实际上是pair,故定义为pair放置在vector里面)及vector的遍历
4、pair插入要用到make_pair(a,b)
代码实现如下:
#include<iostream>
#include<map>
#include<utility>
using namespace std;
const int maxn = 1010;
double a[maxn],b[maxn];
int N,D;
map<int,double>danjia;
vector<pair<int,double>>buf;
bool cmp(pair<int,double>mp1,pair<int,double>mp2)
{
return mp1.second>mp2.second;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>N>>D;
for(int i = 0;i<N;i++) cin>>a[i];
for(int i = 0;i<N;i++)
{
cin>>b[i];
danjia[a[i]] = b[i]/a[i];
}
for(map<int,double>::iterator it = danjia.begin();it!=danjia.end();it++)
{
buf.push_back(make_pair(it->first,it->second));
}
sort(buf.begin(),buf.end(),cmp);
sort(b,b+N);
int ct = 0;
double ans = 0.0;
// for(auto it : buf) cout<<it.first<<' '<<it.second<<endl;
for(auto it : buf)
{
if(it.first<=D)
{
ans = ans + (double)D * it.second;
D = 0;
return 0;
}
else
{
ans = ans + (double)it.first * it.second;
D-=it.first;
}
if(D == 0) break;
}
// printf("%.2lf\n",ans);
cout<<ans<<endl;
return 0;
}