地址:http://codeforces.com/contest/994/problem/B
题意:有n个骑士,每个骑士有一个power值,和一个c金钱,然后每个骑士可以杀k个人,并且杀的人的power值要小于你当前的骑士,然后分开考虑所有骑士,求每个骑士的能获得的最大金币数。
思路:贪心,按照power从小到大排序,然后维护一个有最多有k个值的vector或者multiset就行了。主要要处理k=0这种情况。
vector版本:
#include <bits/stdc++.h>
using namespace std;
int n, k;
const int maxn = 1e5 + 5;
typedef long long ll;
struct node {
ll p, c, id, val;
} e[maxn];
ll p[maxn], c[maxn];
bool cmp(node a, node b) {
return a.p < b.p;
}
bool cmp2(node a, node b) {
return a.id < b.id;
}
int main() {
/*
对p值排序,然后维护一个最多只有k个元素的vector(维护的是金钱),然后如果vector中
的元素数量已经等于k的时候,每次选取vector中最小的元素,比较当前的
金钱数和vector中最小的金钱数,如果vector中的元素小,那就删除了之后
在将新的加进去就行了。
*/
scanf("%d%d", &n, &k);
for(int i = 1; i <= n; i++) scanf("%I64d", &e[i].p);
for(int i = 1; i <= n; i++) scanf("%I64d", &e[i].c);
for(int i = 1; i <= n; i++) e[i].id = i;
sort(e + 1, e + 1 + n, cmp);
vector<ll>v;
vector<ll>::iterator it;
for(int i = 1; i <= n; i++) {
ll ans = e[i].c;
if(i <= k) {
for(it = v.begin(); it != v.end(); it++) {
ans += *it;
}
v.push_back(e[i].c);
} else {
for(it = v.begin(); it != v.end(); it++) {
ans += *it;
}
sort(v.begin(), v.end());
if(v.begin() != v.end() && v[0] < e[i].c) {//如果v中没有元素,那么调用v[0]会re
v.erase(v.begin());
v.push_back(e[i].c);
}
}
e[i].val = ans;
}
sort(e + 1, e + 1 + n, cmp2);
for(int i = 1; i <= n; i++) printf("%I64d ", e[i].val);
return 0;
}
multiset版本:
#include <bits/stdc++.h>
using namespace std;
int n, k;
const int maxn = 1e5 + 5;
typedef long long ll;
struct node {
ll p, c, id, val;
} e[maxn];
ll p[maxn], c[maxn];
bool cmp(node a, node b) {
return a.p < b.p;
}
bool cmp2(node a, node b) {
return a.id < b.id;
}
int main() {
scanf("%d%d", &n, &k);
for(int i = 1; i <= n; i++) scanf("%I64d", &e[i].p);
for(int i = 1; i <= n; i++) scanf("%I64d", &e[i].c);
for(int i = 1; i <= n; i++) e[i].id = i;
sort(e + 1, e + 1 + n, cmp);
multiset<int>s;
multiset<int>::iterator it;
for(int i = 1; i <= n; i++) {
ll ans = e[i].c;
it = s.end();
if(s.size() != 0) { it--;
for(int j=1;j <= k; j++, it--) {
ans += *it;
if(it == s.begin()) break;
}
}
s.insert(e[i].c);
e[i].val = ans;
}
sort(e + 1, e + 1 + n, cmp2);
for(int i = 1; i <= n; i++) printf("%I64d ", e[i].val);
return 0;
}