题目链接

https://codeforces.com/problemset/problem/1978/D

题意

对于每个测试用例,共有 \(n\) 个人,每个人的号码分别是 \(1,2,...,n\),每个人的粉丝数量是 \(a_i\),他们的粉丝都会为他们投票。有c人举棋不定,他们会将票投给号码最小的人。你可以让任意数量的人退出选举,然后他们的粉丝会变为举棋不定者。问:想让第 \(i\) 人赢得选举,最少需要让几个人退出选举?若有相同票数的,号码较小者获胜

题解

突破点:只要\(a[i]\)不是最大值,你前面的全部候选者都必然退出选举

当有人退出选举时,变为举棋不定者的必定会投给当前剩下的候选者中号码最小者。因此,在全部人均不放弃选举的条件下,若第 \(i\) 个候选者不是全部值中的最大值且是最大值中号码最小的,必定无法获得胜利,若已经是最大值且是最大值中号码最小的,直接可以获得胜利。

在第 \(i\) 个候选者无法获取胜利的情况下,想要让举棋不定者为他投票,唯一的办法是让全部号码比他小的人均放弃选举,从而使得第 \(i\) 个候选者成为剩余的候选者中号码最小的,进而得到全部的举棋不定者的投票。若得到全部举棋不定者的投票后,仍无法成为全部候选者中值最大者,那么只需要让值最大者也放弃选举即可。

举个例子:

\(1\)

\(5\) \(1\)

\(3\) \(1\) \(2\) \(5\) \(5\)

\(1\) \(1\) \(2\) \(0\) \(4\)

在全部人均不放弃选举的情况下,\(c\) 为举棋不定者必定是为第 \(1\) 位候选者投票,原因是其号码最小。所以五名候选者可以视为:

\(4\) \(1\) \(2\) \(5\) \(5\)

在没人放弃选举的情况下,值最大者为 \(mx = 5\),下标为 \(mx\_idx = 4\)。

对于第 \(1\) 个候选者,值不为最大值,其下标满足为全部候选者中号码最小,那么只需要让值最大者放弃选举即可使其获胜,因此需要放弃选举的人数为 \(1\);

对于第 \(2\) 个候选者,值不为最大值,其前面的人放弃选举,他便可成为值最大者且是值最大者中号码最小的,因此需要放弃选举的人数是 \(1\);

对于第 \(3\) 个候选者,值不为最大值,其前面的人放弃选举,他便可成为值最大者且是值最大者中号码最小的,因此需要放弃选举的人数是 \(2\);

对于第 \(4\) 个候选者,值为最大值且是值最大者中号码最小的,因此需要放弃选举的人数是 \(0\);

对于第 \(5\) 个候选者,值为最大值,但是号码不是值最大者中最小的,其前面的人放弃选举,他便可成为值最大者且是值最大者中号码最小的,因此需要放弃选举的人数是 \(4\)。

总的来说,可以分为以下三种情况:

  1. \(a[i]\) 是 \(a\) 中最大值且 \(i = mx\_idx\),那么需要放弃选举的人数为 \(0\);
  2. \(a[i]\) 加上其前面的所有候选者的值(包括举棋不定者的值)已为最大值,那么需要放弃选举的人数为 \(i - 1\);
  3. \(a[i]\) 加上其前面的所有候选者的值(包括举棋不定者的值)仍无法成为最大值,那么需要放弃选举的人数为 \(i\)。

参考代码

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std; typedef long long ll; constexpr int N = 2e5 + 7;
int T, n, c, mx_idx;
int a[N]; void solve() {
cin >> n >> c;
for (int i = 0; i < n; ++ i) cin >> a[i];
a[0] += c;
mx_idx = 0;
for (int i = 0; i < n; ++ i) if (a[i] > a[mx_idx]) mx_idx = i;
ll sum = 0;
int &mx = a[mx_idx];
for (int i = 0; i < n; ++ i) {
if (a[i] > mx || a[i] == mx && i <= mx_idx) {
cout << "0 ";
} else if (sum + a[i] >= mx) {
cout << i << ' ';
} else {
cout << (i + 1) << ' ';
}
sum += a[i];
}
cout << '\n';
} int main() {
IOS
cin >> T;
while (T --) solve();
return 0;
}

codeforces 1978 D. Elections的更多相关文章

  1. CodeForces - 457C:Elections(三分)

    You are running for a governor in a small city in Russia. You ran some polls and did some research, ...

  2. [Codeforces]850E - Random Elections

    FWT裸题,写了下模板 #include<cstdio> #define ll long long #define r register int #define MN (1<< ...

  3. CodeForces - 1020C C - Elections(贪心+枚举)

    题目: 党派竞争投票 有n个人,m个党派,这n个人每个人有一个想要投的党派的编号Pi,如果想要这个人改变他的想法,那么就需要花费Ci元钱. 现在你是编号为1的党派,如果你想要赢(你的票数严格大于其他党 ...

  4. 【Codeforces 1019A】Elections

    [链接] 我是链接,点我呀:) [题意] 每个人都有自己喜欢的队员 但是如果贿赂他们可以让他们更改自己喜欢的队员 问你最少要花多少钱贿赂队员才能让1号队员严格有最多的人喜欢? [题解] 除了1号之外, ...

  5. Codeforces #503 C. Elections(贪心,逆向

    我的参考的博客地址 题目 逆向考虑. 暴力遍历 k(k是1到n/2+1 范围内的),挑出对于每一个k,记对于党派 i,num[ i ]为其票数.num[ i ]小于k-1的就不用改变投票了(这部分是比 ...

  6. codeforces 1020 C Elections(枚举+贪心)

    题意: 有 n个人,m个党派,第i个人开始想把票投给党派pi,而如果想让他改变他的想法需要花费ci元.你现在是党派1,问你最少花多少钱使得你的党派得票数大于其它任意党派. n,m<3000 思路 ...

  7. Codeforces C. Elections(贪心枚举三分)

    题目描述: C. Elections time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  8. Codeforces Round #157 (Div. 1) B. Little Elephant and Elections 数位dp+搜索

    题目链接: http://codeforces.com/problemset/problem/258/B B. Little Elephant and Elections time limit per ...

  9. Little Elephant and Elections CodeForces - 258B

    Little Elephant and Elections CodeForces - 258B 题意:给出m,在1-m中先找出一个数x,再在剩下数中找出6个不同的数y1,...,y6,使得y1到y6中 ...

  10. Codeforces Round #503 (by SIS, Div. 2) C. Elections (暴力+贪心)

    [题目描述] Elections are coming. You know the number of voters and the number of parties — n and m respe ...

随机推荐

  1. 【HFSS】HFSS绘制梯形走线的5种方法

    使用HFSS仿真PCB走线,需要对走线进行建模,但是由于PCB制造过程中的蚀刻导致走线截面不是理想的矩形,而是接近梯形.为了使仿真尽量精确,需要将PCB走线截面绘制成梯形.下面介绍几种绘制梯形走线的方 ...

  2. [TK] 三角蛋糕 hzoi-tg#261

    同机房大佬也写了这道题的 题解. 我在另一篇 题解 中提到了这类问题的通解,接下来我们依照此通解思考该题. 问题处理 首先我们来定义三角形的表示方式. 定义 \(f[i][j]\) 表示三角形 \(( ...

  3. Java实用小工具系列1---使用StringUtils分割字符串

    经常有这种情况,需要将逗号分割的字符串,比如:aaa, bbb ,ccc,但往往是人工输入的,难免会有多空格逗号情况,比如:aaa, bbb , ccc, ,,这种情况使用split会解析出不正常的结 ...

  4. html5新标签 画布 canvas 替代了 flash

    绘制矩形边框,和填充不同的是绘制使用的是strokeRect, 和strokeStyle实现的 绘制路径 绘制路径的作用是为了设置一个不规则的多边形状态 路径都是闭合的,使用路径进行绘制的时候需要既定 ...

  5. 云原生周刊:Kubernetes v1.31 发布

    开源项目推荐 Kardinal Kardinal 是一个用于在共享 Kubernetes 集群中创建超轻量级临时开发环境的框架. Anteon Anteon(以前称为 Ddosify)是一个开源的.基 ...

  6. F450 APM2.8 自组无人机手记

    由于是初次接触无人机,外加自组需要焊接,做了一些前期的心理建设.但是过程还是异常艰难.(不过,实际操作也就焊20个焊点左右,基本就组装起来了,操作并不复杂) 自组APM无人机是想学习Ardupilot ...

  7. 史上最全ThreadLocal 详解

    概述 线程本地变量.当使用 ThreadLocal 维护变量时, ThreadLocal 为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程. 每个 ...

  8. 使用 FastGPT 工作流搭建 GitHub Issues 自动总结机器人

    如今任何项目开发节奏都很快,及时掌握项目动态是很重要滴,GitHub Issues 一般都是开发者和用户反馈问题的主要渠道. 然而,随着 Issue 数量的增加,及时跟进每一个问题会变得越来越困难. ...

  9. Java面试题及答案整理汇总(2024最新版)

    前言 辞退了老板,准备找下家,又要开始面试了,不得不准备准备八股文,还是很有必要针对性的刷一些题,很多朋友的实战能力很强,但是理论比较薄弱,要多准备准备理论知识,攻克面试官.这是我在全网寻找稍微比较完 ...

  10. WebUI自动化框架-playwright

    (持续更新) 一.环境准备 安装playwright:playwright是基于python3.7开发的第三方包,所以需要使用的python版本是3.7及其以上的 pip install playwr ...