[CF994B] Knights of a Polygonal Table - 贪心,堆

有 n 个骑士想决战。每个骑士都有能力值(互不相同),且身上带有一些金币。如果骑士 A 的能力值大于骑士 B ,那么骑士 A 就可以杀死骑士 B ,并获得骑士 B 身上的所有金币。但就算是骑士也不会残忍过度,他们最多只会杀死 k 个骑士。对于每一位骑士,请你求出在杀掉所有他能杀的人(只有他能杀人别人不动)后他身上金币的最大值。

Solution

注意到“互不相同”这个弱化条件,考虑对能力值从小到大排序,那么每个骑士能且只能杀他前面的人。所以动态维护前 \(k\) 大和就好了

(题意有点神仙)

#include 
using namespace std;

#define int long long
const int N = 100005;

struct knight {
    int p,c,ans,id;
    bool operator < (const knight &x) const {
        return c > x.c;
    }
} a[N];

int n,k,ans[N];

bool cmp(const knight &x, const knight &y) {
    return x.p < y.p;
}

signed main() {
    ios::sync_with_stdio(false);
    cin>>n>>k;
    for(int i=1;i<=n;i++) a[i].id=i;
    for(int i=1;i<=n;i++) cin>>a[i].p;
    for(int i=1;i<=n;i++) cin>>a[i].c;
    sort(a+1,a+n+1,cmp);
    priority_queue  q;
    int sum=0;
    for(int i=1;i<=n;i++) {
        a[i].ans = sum;
        sum += a[i].c;
        q.push(a[i]);
        if(q.size()>k) {
            sum -= q.top().c;
            q.pop();
        }
    }
    for(int i=1;i<=n;i++) ans[a[i].id]=a[i].ans+a[i].c;
    for(int i=1;i<=n;i++) cout<

你可能感兴趣的:([CF994B] Knights of a Polygonal Table - 贪心,堆)