给定一串数,问删除中间一段,剩下的平均数最小是多少;

不容易想到这是个二分。

$solution:$

来手玩一点式子:

首先很容易想到一个前缀和$sum_i $表示i到1的前缀和,这样就能很容易地O(1)查询区间和/差

二分一个mid,作为最小的平均数。

假设删去区间为l~r(lr都删)

平均数等于:

$ave={sum_{i-1} + sum_{n-j} }/{n-(j-i+1)}$

于是,这里就就有了单调性:

$mid \leq ave$

稍微变形一下,就得到

$sum_n-sum_j+sum_{i-1} \leq mid*n-mid*j+mid*(i-1)$

$(sum_n-mid*n) \geq (sum_j-mid*j) - (sum_{i-1}-mid*(i-1)  $

令$sum_i-i*mid$=$C_i$

则只需要判断

$C_n \geq C_j - C_{i-1} $

就能判断二分边界了。

复杂度$O(n)$

稍微注意下边界,就能A掉了。

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+;
double sum[maxn];
int n;
double c[maxn];
double maxx[maxn];
double minn[maxn];
bool check(double x)
{
for(int i=;i<=n;i++)
{
c[i]=sum[i]-i*x;
}
minn[]=c[];
for(int i=;i<=n;i++)
{
minn[i]=min(c[i],minn[i-]);
}
maxx[n-]=c[n-];
for(int i=n-;i>=;i--)
{
maxx[i]=max(c[i],maxx[i+]);
}
for(int i=;i<n;i++)
{
if(maxx[i]-minn[i-]>c[n])
return ;
}
return ;
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
double x;
scanf("%lf",&x);
sum[i]=sum[i-]+x;
}
double l=,r=1e4+;
while((r-l)>0.000000001)
{
double mid=(l+r)/;
if(check(mid)==)
l=mid;
else
r=mid;
}
printf("%.3lf",l);
return ;
}

(完)

最新文章

  1. 循序渐进做项目系列(3):迷你QQ篇(1)——实现客户端互相聊天
  2. ZOJ-2342 Roads 二分图最小权值覆盖
  3. 使用XAMPP本地安装Wordpress博客
  4. FZU 2112 Tickets
  5. ExperDot的博客目录导航
  6. Java学习笔记5(类的入门以及ArrayList)
  7. WPF 小小案列(同步异步)
  8. ☆ [HNOI2012] 永无乡 「平衡树启发式合并」
  9. Angular MVC
  10. Apache Commons Digester 二(规则模块绑定-RulesModule、异步解析-asyncParse、xml变量Substitutor、带参构造方法)
  11. 四则运算 来源:一位热心的网友 http://www.tqcto.com/article/software/336297.html
  12. WebClient和WebRequest获取html代码
  13. [UE4]使用另一个相机Scene Capture Component 2D当小地图
  14. 预读(读取文件前几行)文件(txt,dat,csv等)程序
  15. kafka存储机制
  16. Solr中的一些查询参数
  17. day9-IO 番外
  18. 如何突破JAVA程序员三年的门槛
  19. samtools软件作用
  20. (4)python 字典

热门文章

  1. 设置Activity全屏的方法:
  2. 我们一起学Python之——认识Python&quot;规则&quot;
  3. Django-debug-toolbar(调试使用)
  4. [Luogu2359] 三素数数
  5. mfc字符转码
  6. vue3.0 + ueditor
  7. 第三方软件 radmin提权
  8. SpringBoot生命周期管理之停掉应用服务几种方法
  9. Arduino学习笔记① 初识Arduino
  10. 玩转OneNET物联网平台之HTTP服务③ —— OneNet智能灯 HTTP版本