首先,对于这题我们要知道要删除一个数使平均值最大一定是删除最小的数,然后我们假设删除操作执行了i次,也就是删除最小的i个数。在已知删除操作次数之后求增加操作的次数就容易了,当然是m - i和k * (n - i)中比较小的数啦。用一个ans变量记录结果,遍历i,更新ans,得到最终的ans。
B - Average Superhero Gang Power | GNU C++11 | Accepted | 46 ms | 400 KB |
#include "bits/stdc++.h" using namespace std; typedef long long LL; const int MAXN = 1e5 + 5; int arr[MAXN]; double ans; int main() { int n, k, m; scanf("%d%d%d", &n, &k, &m); LL sum = 0; for (int i = 1; i <= n; i++) { scanf("%d", &arr[i]); sum += arr[i]; } sort(arr + 1, arr + 1 + n); for (int i = 0; i < n && i <= m; i++) { sum -= arr[i]; // min和max函数要求两个参数数据类型相同,k * (n - i)可能爆int,所以两边都转成LL; ans = max(ans, (sum + min(1LL * m - i, 1LL * k * (n - i))) * 1.0 / (n - i)); } printf("%.8lf", ans); return 0; }