• codeforces 1251E (贪心)


    传送门

    很巧妙的贪心. 

    我想用最少的钱让所有人都给我投票.

    思路: 对于所有$m$值为$i$的人, 都必须满足已选人数$>i$才行. 如果$i+1$的人满足了, 那么$i$的人也会被满足,

    那么我们可以从$n$到$0$来贪心. 我们可以先将所有$m$值为$i$的人放到一个"隔离区", 假设隔离区里的人都不被收买,

    那么被收买的人的个数就是$n-size$, $n$是总人数, $size$就是"隔离区"里人的个数.

    如果$n-size<i$, 就说明放入"隔离区"的人多了啊, 我们应该将其中的人"赎"出来,

    为了付出最少的代价使得$n-size>=i$, 我们可以使用优先队列来作为这个"隔离区", 将$p$最小的人一个一个往外买就对了.

    ========================================

    CF 的 E 题哪怕是个贪心也是真的难啊orz

    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <vector>
    #include <queue>
    #include <algorithm>
    #define MAXN 200010
    using namespace std;
    typedef long long LL;
    int T,n;
    vector<int> vec[MAXN];
    priority_queue<int,vector<int>,greater<int> > pq;
    
    bool cmp(int x,int y){return x>y;}
    
    void solve(){
        while(!pq.empty()) pq.pop();
        scanf("%d",&n);
        for(int i=0;i<=n;i++) vec[i].clear();
        for(int i=1,m,p;i<=n;i++){
            scanf("%d%d",&m,&p);
            vec[m].push_back(p);
        }
        LL ans=0;
        for(int i=n;i>=0;i--){
            for(int j=0;j<vec[i].size();j++) pq.push(vec[i][j]);
            while(pq.size()>n-i) ans+=pq.top(),pq.pop();
        }
        printf("%lld
    ",ans);
    }
    
    int main(){
        scanf("%d",&T);
        while(T--) solve();
        return 0;
    }
  • 相关阅读:
    Linux Xshell常用命令(项目部署)
    返回的数据转换成百分比分的方法
    百度分享插件
    vue请求中 post get传参方式是不同的哦
    Axios 中文使用
    关于iview ui的"Page分页"组件的使用
    Vue 实现前进刷新,后退不刷新的效果
    Vue框架Element UI教程-axios请求数据
    Spring学习总结(8)-接口多个实现类的动态调用
    Redis集群
  • 原文地址:https://www.cnblogs.com/BakaCirno/p/11761323.html
Copyright © 2020-2023  润新知