二分
ABC 236 E - Average and Median
题目链接
https://atcoder.jp/contests/abc236/tasks/abc236_e
解析
- 想到了dp以及状态表示,但是没想出来怎么状态转移,主要没想到是用dp来判断mid行不行的,总体框架来看是个二分答案的题
- 本题对于中位数和平均数的处理特别经典,可以学习
- 题解就不写了,参考这篇博客吧
https://blog.csdn.net/Mr_dimple/article/details/122679274
Ac代码
点击查看代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e5 + 10;
int n;
double f[N][2];
double b[N];
int a[N];
bool check1(double mid){
for(int i = 1; i <= n; i ++) b[i] = a[i] - mid;
for(int i = 1; i <= n; i ++){
f[i][0] = f[i - 1][1];
f[i][1] = max(f[i - 1][0], f[i - 1][1]) + b[i];
}
return max(f[n][0], f[n][1]) > 0;
}
bool check2(int mid){
for(int i = 1; i <= n; i ++) b[i] = a[i] >= mid ? 1 : -1;
for(int i = 1; i <= n; i ++){
f[i][0] = f[i - 1][1];
f[i][1] = max(f[i - 1][1], f[i - 1][0]) + b[i];
}
return max(f[n][0], f[n][1]) > 0;
}
int main()
{
scanf("%d", &n);
int maxa = 0;
for(int i = 1; i <= n; i ++) scanf("%d", &a[i]), maxa = max(maxa, a[i]);
//求最大平均数
double ll = 0, rr = maxa;
while(rr - ll > 1e-4){
double mid = (ll + rr) / 2;
if(check1(mid)) ll = mid;
else rr = mid;
}
printf("%.10lf\n", ll);
//求最大中位数
int l = 0, r = 1e9;
while (l < r)
{
int mid = l + r + 1 >> 1;
if (check2(mid)) l = mid;
else r = mid - 1;
}
printf("%d\n", l);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架