codeforces 1978 D. Elections
题目链接
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\)。
总的来说,可以分为以下三种情况:
- \(a[i]\) 是 \(a\) 中最大值且 \(i = mx\_idx\),那么需要放弃选举的人数为 \(0\);
- \(a[i]\) 加上其前面的所有候选者的值(包括举棋不定者的值)已为最大值,那么需要放弃选举的人数为 \(i - 1\);
- \(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;
}
浙公网安备 33010602011771号