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-1]>=x$那么不需要处理

如果$pre[x-1]<x$那么$m$在$x$到$n$的人至少要收买$x-pre[x-1]$个人

得到所有$x$需要收买的后缀,显然,从后往前处理最优

AC代码:

#include <bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
using namespace std;
const int maxn=2e5+7;
int pre[maxn];
vector<int>ve[maxn];
multiset<int>se;
int main() {
    int T,n;
    scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            int a,b;
            scanf("%d %d",&a,&b);
            pre[a]++;
            ve[a].push_back(b);
        }
        for(int i=1;i<=n;i++)
            pre[i]+=pre[i-1];
        int cnt=0;
        ll ans=0;
        for(int i=n;i>=1;i--){
            for(int j=0;j<ve[i].size();j++)se.insert(ve[i][j]);
            int v=i-cnt-pre[i-1];
            while(v>0){
                ans+=(*se.begin());
                se.erase(se.begin());
                v--;
                cnt++;
            }
        }
        se.clear();
        for(int i=0;i<=n;i++)ve[i].clear(),pre[i]=0;
        printf("%lld\n",ans);
    }
    return 0;
}

  

原文地址:https://www.cnblogs.com/carcar/p/11761552.html

时间: 2024-10-01 07:07:48

codeforces#1251E2. Voting (Hard Version)(贪心)的相关文章

Codeforces 442B Andrey and Problem(贪心)

题目链接:Codeforces 442B Andrey and Problem 题目大意:Andrey有一个问题,想要朋友们为自己出一道题,现在他有n个朋友,每个朋友想出题目的概率为pi,但是他可以同时向多个人寻求帮助,不过他只能要一道题,也就是如果他向两个人寻求帮助,如果两个人都成功出题,也是不可以的. 解题思路:贪心,从概率最大的人开始考虑,如果询问他使得概率变大,则要询问. #include <cstdio> #include <cstring> #include <a

Codeforces Round #300-Tourist&#39;s Notes(贪心)

Tourist's Notes Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Description A tourist hiked along the mountain range. The hike lasted for n days, during each day the tourist noted height above the sea level

Codeforces 432E Square Tiling(构造+贪心)

我们通常这么写 using (SqlDataReader drm = sqlComm.ExecuteReader()) { drm.Read();//以下把数据库中读出的Image流在图片框中显示出来. MemoryStream ms = new MemoryStream((byte[])drm["Logo"]); Image img = Image.FromStream(ms); this.pictureBox1.Image = img; } 我的写数据 private void b

Codeforces 1251E Voting

E2. Voting (Hard Version) 题意: 有n个人, 你想让他们都给你投票. 你可以选择花费pi收买第i个人, 或者如果有mi个人已经给你投票了, 那么第i个人会自动给你投票. 不妨把题目等价为, 给n个人排一个先后投票的顺序, 假设在这个顺序中, 第k个投票的人, 它的mi不超过k-1, 那么这个人就不需要花钱收买, 否则就需要花钱收买. 那么我们依次考虑第1,2,3,....n个投票的位置让哪个人来投票. 可以发现, 只要我们让"不需要花钱收买的人省下的钱"最大化

Codeforces Round # 555 (Div. 3) C2. Increasing subsequence (complicated version) (贪心)

题目链接:http://codeforces.com/contest/1157/problem/C2 当左右两边数字相同时,需要判断一下取哪边能得到更长的递增序列 #include <iostream> #include <cstring> #include <algorithm> #include <cmath> #include <cstdio> #include <queue> #include <climits>

CodeForces - 1251E2 (思维+贪心)

题意 https://vjudge.net/problem/CodeForces-1251E2 一共有 n 个选民,你可以付出 pi? 的代价让第 i 个选民为你投票,或者,在为你投票的人数达到 mi? 时,他会主动为你投票而不用你付出任何代价. 问得到所有选民投票的最小代价. 思路 考虑贪心,对容易跟风的就跟风,对不容易跟风的就贿赂,所以对每个mi用vector插入相应的pi,然后从大到小遍历vector(不易跟风的要花钱),对于每一个mi,把对应的p插入到小根堆,小根堆里的人默认是跟风的,设

Codeforces 798D Mike and distribution - 贪心

Mike has always been thinking about the harshness of social inequality. He's so obsessed with it that sometimes it even affects him while solving problems. At the moment, Mike has two sequences of positive integers A = [a1, a2, ..., an] and B = [b1, 

codeforces 349B Color the Fence 贪心,思维

1.codeforces 349B    Color the Fence 2.链接:http://codeforces.com/problemset/problem/349/B 3.总结: 刷栅栏.1-9每个字母分别要ai升油漆,问最多可画多大的数字. 贪心,也有点考思维. #include<bits/stdc++.h> using namespace std; #define LL long long #define INF 0x3f3f3f3f int main() { int v,a[1

codeforces 343C Read Time 二分 + 贪心

http://codeforces.com/problemset/problem/343/C 题意: 有一些磁头,给出了起始的位置,给出了一些磁盘中需要访问的地点.求这些磁头移动的最小的次数. 思路: 二分找出满足要求的最小的时间,对于当前尝试的时间进行贪心判断是否可用.对于贪心,因为每一个磁头都需要读到还没有人读过的最左边的地方.如果这个都不能满足,那么这个时间是不可以的. 在这基础上,对于同样的这么多时间,尽可能的让这个磁头读到能读到的最右边,这样就可以将还没有读过的地方尽可能的往右推. 如