zoukankan      html  css  js  c++  java
  • [CF994B] Knights of a Polygonal Table

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

    Solution

    注意到“互不相同”这个弱化条件,考虑对能力值从小到大排序,那么每个骑士能且只能杀他前面的人。所以动态维护前 (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]<<" ";
    }
    
  • 相关阅读:
    过滤器--起步阶段
    常用指令-起步阶段
    模型和控制器-起步阶段
    指令介绍-起步阶段
    AngularJS简介-起步阶段
    c++之helloworld与命名空间
    c++ 之重要性
    一个没曾摸透的程序
    linux中什么是文件结构体?
    很全的linux网络编程技巧
  • 原文地址:https://www.cnblogs.com/mollnn/p/12292623.html
Copyright © 2011-2022 走看看