Codeforces 1251E Voting

E2. Voting (Hard Version)
题意: 有n个人, 你想让他们都给你投票. 你可以选择花费pi收买第i个人, 或者如果有mi个人已经给你投票了, 那么第i个人会自动给你投票.
不妨把题目等价为, 给n个人排一个先后投票的顺序, 假设在这个顺序中, 第k个投票的人, 它的mi不超过k-1, 那么这个人就不需要花钱收买, 否则就需要花钱收买.
那么我们依次考虑第1,2,3,....n个投票的位置让哪个人来投票. 可以发现, 只要我们让"不需要花钱收买的人省下的钱"最大化, 就相当于让代价最小化了.
对于每个位置, 最优化这个位置的收益. 而且越靠前的位置越无用, 所以我们从前往后依次考虑每个位置, 最大化每个位置的收益, 也就是在每个位置考虑能在这个位置避免花钱收买的人, 把其中花钱最多的人放到这个位置. 借助一个堆来实现即可.

#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
typedef long long i64;
const int maxn = 200005;
struct vote{
    int m, p;
    bool operator < (const vote &b)const{
        return m < b.m;
    }
}V[maxn];
void work(){
    int n;scanf("%d", &n);
    for(int i=1;i<=n;++i){
        scanf("%d%d", &V[i].m, &V[i].p);
    }
    sort(V+1, V+n+1);
    priority_queue<int> q;
    i64 ans = 0;
    int pt = 1;
    for(int i=0;i<n;++i){
        while(pt <= n && V[pt].m<=i){
            ans += V[pt].p;
            q.push(V[pt].p);
            ++pt;
        }
        if(!q.empty()){
            ans -= q.top();
            q.pop();
        }
    }
    printf("%lld\n", ans);
}
int main(){
    int t;scanf("%d", &t);
    while(t--)work();
    return 0;
}

原文地址:https://www.cnblogs.com/liu-runda/p/11980284.html

时间: 2024-10-09 01:30:45

Codeforces 1251E Voting的相关文章

codeforces#1251E2. Voting (Hard Version)(贪心)

题目链接: http://codeforces.com/contest/1251/problem/E2 题意: 主角需要获得n个人的投票 有两种方式让某个人投票 1,已经投票的人数大于m 2,花p枚硬币收买 数据范围: $1\leq n \leq 200 000$ 分析: 对$m$进行排序 保留前缀的$m$数组,$pre[x]$为$m$小于等于$x$的人数 对x逆序处理,当枚举到$x$的时候,假设$m$小于等于$x-1$的那些人已经投票,也就是有$pre[x-1]$人已经投票 如果$pre[x-

Voting CodeForces - 749C

有点意思的题 Voting CodeForces - 749C 题意:有n个人投票,每次按照第1个人~第n个人的顺序发言,如果到某个人发言时他已经被禁止发言就跳过,每个人发言时可以禁止另一个人发言或什么也不做.最后只剩下一个人时,那个人的意见就是最终决定的意见.这些人分为D和R两派,也就是每个人有D和R两种意见中的一种,每一派的人都希望自己派的意见成为最终意见.假设每个人都作出最优选择,请根据每个人的派别判断最终决定的意见. 方法:第i个人发言的时候,就按照第i~第n,第1~第i-1的顺序找出第

Codeforces Round #388 (Div. 2) C. Voting

题意:有n个人,每个人要么是属于D派要么就是R派的.从编号1开始按顺序,每个人都有一次机会可以剔除其他任何一个人(被剔除的人就不在序列中也就失去了剔除其他人的机会了):当轮完一遍后就再次从头从仅存的人中从编号最小开始重复执行上述操作,直至仅存在一派,问最后获胜的是哪一派? 并且,题目假设每个人的选择是最优的,即每个人的操作都是会尽可能的让自己所属的派获胜的. 题解: 一开始看到说每个人的操作都会是最优的还以为是个博弈(=_=),,,仔细琢磨了下样例发现并不用,只要贪心模拟就行了.贪心的策略并不难

codeforces D. Ice Sculptures 题解

The Berland University is preparing to celebrate the 256-th anniversary of its founding! A specially appointed Vice Rector for the celebration prepares to decorate the campus. In the center of the campus n ice sculptures were erected. The sculptures

【codeforces 718E】E. Matvey&#39;s Birthday

题目大意&链接: http://codeforces.com/problemset/problem/718/E 给一个长为n(n<=100 000)的只包含‘a’~‘h’8个字符的字符串s.两个位置i,j(i!=j)存在一条边,当且仅当|i-j|==1或s[i]==s[j].求这个无向图的直径,以及直径数量. 题解:  命题1:任意位置之间距离不会大于15. 证明:对于任意两个位置i,j之间,其所经过每种字符不会超过2个(因为相同字符会连边),所以i,j经过节点至多为16,也就意味着边数至多

Codeforces 124A - The number of positions

题目链接:http://codeforces.com/problemset/problem/124/A Petr stands in line of n people, but he doesn't know exactly which position he occupies. He can say that there are no less than a people standing in front of him and no more than b people standing b

Codeforces 841D Leha and another game about graph - 差分

Leha plays a computer game, where is on each level is given a connected graph with n vertices and m edges. Graph can contain multiple edges, but can not contain self loops. Each vertex has an integer di, which can be equal to 0, 1 or  - 1. To pass th

Codeforces Round #286 (Div. 1) A. Mr. Kitayuta, the Treasure Hunter DP

链接: http://codeforces.com/problemset/problem/506/A 题意: 给出30000个岛,有n个宝石分布在上面,第一步到d位置,每次走的距离与上一步的差距不大于1,问走完一路最多捡到多少块宝石. 题解: 容易想到DP,dp[i][j]表示到达 i 处,现在步长为 j 时最多收集到的财富,转移也不难,cnt[i]表示 i 处的财富. dp[i+step-1] = max(dp[i+step-1],dp[i][j]+cnt[i+step+1]) dp[i+st

Codeforces 772A Voltage Keepsake - 二分答案

You have n devices that you want to use simultaneously. The i-th device uses ai units of power per second. This usage is continuous. That is, in λ seconds, the device will use λ·ai units of power. The i-th device currently has bi units of power store