「Codeforces 1111B」Average Superhero Gang Power

题目链接

首先观察求平均数的公式

avg=sumn avg=\frac{sum}{n}

所以我们要么改变 sumsum 要么改变 nn

如果忽略 kk 这个条件,我们有以下解法

我们先删数,数量记为为 qq ,剩余数的和记为 ss'

avg=s+mqnq avg = \frac{s'+m-q}{n-q}

对于一个数,我们要么舍弃,要么保留,显然的我们需要先删小的数(可以用 Exchange Argument 证明

1
2
3
4
5
6
7
8
std::sort(a + 1, a + 1 + n, std::greater<int>());
double sum = 0, ans = 0;
rep(i, 1, n) {
sum += a[i];
int q = n - i;
if (m >= q)
ans = std::max(ans, (sum + m - q) / i)
}

现在我们加上 kk 这个条件,我们只需改动一行代码(因为 kk 的约束导致加上 mqm-q 的目标不一定可以实现

1
ans = std::max(ans, (sum + std::min((m - q), i * k)) / i);

复杂度 O(n)O(n)

我也不知道我比赛时怎么想出 O(nlogn)O(n\log n) 的错误算法(划掉

此题需要注意溢出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <algorithm>
#include <iomanip>
#include <iostream>
#define rep(i, l, r) for (int i = (l); i <= (r); ++i)
#define per(i, l, r) for (int i = (l); i >= (r); --i)
using std::cerr;
using std::cin;
using std::cout;
using std::endl;
using std::make_pair;
using std::pair;
typedef pair<int, int> pii;
typedef long long ll;
typedef unsigned int ui;

ll a[100100];

int main() {
std::ios::sync_with_stdio(false);
cout.tie(0);
ll n, k, m;
cin >> n >> k >> m;
double l, r;
rep(i, 1, n) cin >> a[i];
std::sort(a + 1, a + 1 + n, std::greater<int>());
double sum = 0, ans = 0;
rep(i, 1, n) {
sum += a[i];
if (m >= (n - i))
ans = std::max(ans, (sum + std::min((m - (n - i)), i * k)) / i);
}
cout.setf(std::ios::fixed);
cout << std::setprecision(14) << ans;
return 0;
}

「Codeforces 1111B」Average Superhero Gang Power

https://gesrua.xyz/archives/题解/Codeforces/CF1111B

作者

Gesrua

发布于

2019-02-04

更新于

2020-11-21

许可协议