Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
6517 18级尹玉文东 2021北京队选拔模拟赛1-A C++ 通过 100 40 MS 3388 KB 1672 2021-04-03 09:30:58

Tests(10/10):


#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 - (double)(a[i])); } else {//二分j 单峰? int l = 1, r = min(i - 1, n - i), mid; double mmax = (double)(a[i]); while(l <= r) { mid = (l + r) >> 1; int sum1 = sum[i - 1] - sum[i - mid] + sum[n] - sum[n - mid + 1];//j = mid - 1 int sum2 = sum[i - 1] - sum[i - mid - 1] + sum[n] - sum[n - mid];//j = mid if((double)(sum1 + a[i]) / (double)(2 * mid - 1) < (double)(sum2 + a[i]) / (double)(2 * mid + 1)) { mmax = max(mmax, (double)(sum2 + a[i]) / (double)(2 * mid + 1)); l = mid + 1; } else { r = mid - 1; } } ans = max(ans, mmax - (double)(a[i])); } } printf("%.4lf\n", ans); return 0; }


测评信息: