CodeforcesRound 488(div2)B. Knights of a Polygonal Table

地址: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;
}

猜你喜欢

转载自blog.csdn.net/yiqzq/article/details/80718555
今日推荐