【CF994B】ポリゴン表の騎士 - 貪欲、スタック

ありnは騎士が戦いにしたいです。各ナイトは(互いに異なる)値に能力を有し、そして誰がいくつかの金貨を有しています。容量はAナイトライダーBの値よりも大きい場合、AはナイトライダーB、Bを殺すために、すべての金の騎士の体を得ることができます。しかし、たとえ残酷な騎士が過大にならないだろう、彼らはほとんどのk個の騎士を殺すでしょう。各騎士のために、あなたは彼が金(唯一、彼は他の誰かが動かない殺すことができる)、彼は殺すことができるすべての人が死亡した後に最大値を求めます。

解決

この弱体化状態「は、互いに、異なる」、能力が大きいために小さな値を考慮し、その後、各騎士が唯一の人々の前で彼を殺すことができると指摘しました。だから、動的なメンテナンスの前に\(K \)日本だけで罰金

(質問の小さな妖精の意味)

#include <bits/stdc++.h>
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 <knight> 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<<ans[i]<<" ";
}

おすすめ

転載: www.cnblogs.com/mollnn/p/12292623.html