Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
6515 | 18级尹玉文东 | 2021北京队选拔模拟赛1-A | C++ | 运行超时 | 40 | 1000 MS | 3368 KB | 1263 | 2021-04-03 09:08:26 |
#include <bits/stdc++.h> #define int long long using namespace std; const int MAXN = 2e5 + 10; const int inf = 0x3f3f3f3f3f3f3f3f; inline int read() { int ret = 0; char ch = getchar(); while(ch < '0' || ch > '9') ch = getchar(); while(ch <= '9' && ch >= '0') { ret = ret * 10 + ch - '0'; ch = getchar(); } return ret; } int n; int a[MAXN], sum[MAXN]; signed main() { n = read(); for(int i = 1; i <= n; i++) a[i] = read(); sort(a + 1, a + n + 1); for(int i = 1; i <= n; i++) sum[i] = sum[i - 1] + a[i]; double ans = (-1.0) * inf; for(int i = 1; i <= n; i++) {//枚举中位数,两侧同时添加点,尽可能靠右 if(n <= 5000) {//subtask1 枚举两侧加2*j个点 double mmax = (double)(a[i]);//只取中位数 for(int j = 1; j <= min(i - 1, n - i); j++) { int add_l = sum[i - 1] - sum[i - j - 1]; int add_r = sum[n] - sum[n - j]; mmax = max(mmax, (double)(add_l + add_r + a[i]) / (double)(2 * j + 1)); } ans = max(ans, mmax - a[i]); } else {//二分j ? int l = 1, r = min(i - 1, n - i), mid; while(l <= r) { mid = (l + r) >> 1; int add_l = sum[i - 1] - sum[i - mid - 1], add_r = sum[n] - sum[n - mid]; } } } printf("%.4lf\n", ans); return 0; }