题目大意:
有n个骑士,每个骑士有一个能量值和一些硬币,一个骑士能够打败能量值比他低的骑士并且获得他的硬币。每个骑士只能打败最多k个人,求出每个骑士最大能获得的硬币数。
题解:
先要对骑士按能量值从大到小排个序,但是输出结果的时候却要按照读入的顺序输出,所以这里就设及到一个坐标转换的问题。
其次对于每个骑士,肯定是选择它能打败的k个骑士,这里就要用到数据结构,一开始想的是用优先队列,但是优先队列获取队列中的元素的值要不断的出队,之后再入队,感觉比较麻烦,于是用了set,但是注意一定要用multiset,用set的话会gg的.
最后注意用long long .
#include<bits/stdc++.h>
#include<cstring>
using namespace std;
#define ll long long
ll ans[100010];
struct node
{
int v,c,id;
}a[100010];
bool cmp(node a,node b)
{
return a.v<b.v;
}
int main()
{
int n,k;
scanf("%d%d",&n,&k);
for(int i=1;i<=n;++i)
scanf("%d",&a[i].v);
for(int i=1;i<=n;++i)
{
scanf("%d",&a[i].c);
a[i].id=i;
}
sort(a+1,a+1+n,cmp);
multiset<int>_set;
for(int i=1;i<=n;++i)
{
ans[a[i].id]+=a[i].c;
for(auto it:_set)
ans[a[i].id]+=it;
_set.insert(a[i].c);
while(_set.size()>k)
_set.erase(_set.begin());
}
for(int i=1;i<n;++i)
printf("%I64d ",ans[i]);
printf("%I64d\n",ans[n]);
return 0;
}