题目链接

Solution

去掉中间一段区间 \([l,r]\) 后剩下的平均值可以表示为 :

\[\frac{\sum^{n}_{i=1}{v_i}-\sum^{r}_{i=l}{v_i}}{n-(r-l+1)}
\]

二分的答案如果要满足条件,即:

\[\frac{\sum^{n}_{i=1}{v_i}-\sum^{r}_{i=l}{v_i}}{n-(r-l+1)}<Ans
\]

移一下项,然后可以得到:

\[{\sum^{n}_{i=1}{(v_i-Ans)}<\sum^{r}_{i=l}{(v_i-Ans)}}
\]

然后这两个式子的意义就是全局 \(v_i-Ans\) 的和比中间这段 \(v_i-Ans\) 要小.

所以只需要有一段前缀和与一段后缀和之和小于等于 \(0\) ,那么答案即满足条件。

Code

#include<bits/stdc++.h>
#define db double
#define ll long long
#define inf 0x3f3f3f3f3f3f3f
#define N 100008
using namespace std;
const db opt=0.00001; void in(ll &x)
{
char ch=getchar();ll f=1,w=0;
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){w=w*10+ch-'0';ch=getchar();}
x=f*w; return;
} db a[N];ll n; bool judge(db st)
{
db sum[N],dum[N],sm[N],dm[N];
sum[0]=dum[N+1]=0;
sm[0]=dm[n+1]=inf;
for(int i=1;i<=n;i++)
sum[i]=sum[i-1]+a[i]-st,
sm[i]=min(sm[i-1],sum[i]);
for(int i=n;i>=1;i--)
dum[i]=dum[i+1]+a[i]-st,
dm[i]=min(dm[i+1],dum[i]);
for(int i=2;i<n;i++)
if(sm[i-1]+dm[i+1]<=0)return 1;
return 0;
} int main()
{
db ans=inf,l=inf,r=0;
in(n);
for(int i=1;i<=n;i++)
{
ll x; in(x);
a[i]=x*1.0;
l=min(a[i],l);
r=max(a[i],r);
}
while(l<=r)
{
db mid=(l+r)/2;
if(judge(mid))ans=min(ans,mid),r=mid-opt;
else l=mid+opt;
}
if(ans==inf)printf("%.3lf\n",(a[1]+a[n])/(2*1.0));
else printf("%.3lf\n",ans);
return 0;
}

[USACO14MAR] 破坏Sabotage(二分答案,分数规划)的更多相关文章

  1. [USACO14MAR] Sabotage 二分答案 分数规划

    [USACO14MAR] Sabotage 二分答案 分数规划 最终答案的式子: \[ \frac{sum-sum[l,r]}{n-len[l,r]}\le ans \] 转换一下: \[ sum[1 ...

  2. [USACO14MAR]破坏Sabotage 二分答案

    题目描述 Farmer John's arch-nemesis, Farmer Paul, has decided to sabotage Farmer John's milking equipmen ...

  3. P2115 [USACO14MAR]破坏(二分答案)

    给定一串数,问删除中间一段,剩下的平均数最小是多少: 不容易想到这是个二分. $solution:$ 来手玩一点式子: 首先很容易想到一个前缀和$sum_i $表示i到1的前缀和,这样就能很容易地O( ...

  4. LuoguP2115 [USACO14MAR]破坏Sabotage【二分答案】By cellur925

    本来是想找一道生成树的题做的...结果被洛咕的标签骗到了这题...结果是二分答案与生成树一点mao关系都没有.... 题目大意:给你一个序列,请你删去某一个$l~r$区间的值($2<=i< ...

  5. BZOJ 4819 Luogu P3705 [SDOI2017]新生舞会 (最大费用最大流、二分、分数规划)

    现在怎么做的题都这么水了.. 题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=4819 (luogu) https://ww ...

  6. [USACO14MAR]破坏Sabotage

    还是二分答案,发现我的$check$函数不太一样,来水一发题解 列一下式子 $$\frac{sum-sum[l,r]}{n-(r-l+1)}<=ans$$ 乘过去 $$sum-sum[l,r]& ...

  7. P2115 [USACO14MAR]破坏Sabotage

    题意:给你一个正整数序列,让你删去一段区间内的数[l,r] $1<l\le r <n$ 使得剩余的数平均值最小$n\le 10^5$ 1.不难想到暴力,用前缀和优化$O(n^2)$ #in ...

  8. BZOJ 3477: [Usaco2014 Mar]Sabotage( 二分答案 )

    先二分答案m, 然后对于原序列 A[i] = A[i] - m,  然后O(n)找最大连续子序列和, 那么此时序列由 L + mx + R组成. L + mx + R = sum - n * m, s ...

  9. 洛谷2115 [USACO14MAR]破坏Sabotage

    https://www.luogu.org/problem/show?pid=2115 题目描述 Farmer John's arch-nemesis, Farmer Paul, has decide ...

随机推荐

  1. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_07 缓冲流_3_BufferedInputStream_字节缓冲

    内容改成abc 来个数组缓冲

  2. delphi 访问 protected 属性 哈哈

    unit Unit39; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, Syste ...

  3. R语言实现金融数据的时间序列分析及建模

    R语言实现金融数据的时间序列分析及建模 一 移动平均    移动平均能消除数据中的季节变动和不规则变动.若序列中存在周期变动,则通常以周期为移动平均项数.移动平均法可以通过数据显示出数据长期趋势的变动 ...

  4. C#实现京东登录密码加密POST

    1.京东登录登录密码 function getEntryptPwd(pwd) { var pubKey = $('#pubKey').val(); if (!pwd || !pubKey || !Sy ...

  5. mooc-IDEA postfix--007

    十三.IntelliJ IDEA -postfix 代码中输入: 总结常用的postfix: 1.for  (<=>100.fori) 2.sout (<=>System.ou ...

  6. Console.Out 属性和 XmlDocument.Save 方法 (String)

    Console.Out 属性 默认情况下,此属性设置为标准输出流. 此属性可以设置为另一个流SetOut方法. 请注意,调用Console.Out.WriteLine方法是等效于调用相应WriteLi ...

  7. [Git] 002 初识 Git 与 GitHub 之加入文件 第一弹

    在 GitHub 的 UI 界面使用 Git 往仓库里加文件 第一弹 1. 点击右上方的 Create new file 2. 在左上方填入文件名,若有后缀,记得加上 3. 页面跳转,此时已有两个文件 ...

  8. Java枚举enum关键字

    枚举的理解 枚举其实就是一个类,枚举类的实例是一组限定的对象 传统的方式创建枚举 [了解] 对比:单例类 1.构造器私有化 2.本类内部创建对象 3.通过public static方法,对外暴露该对象 ...

  9. STM32启动地址设置及从非0x800000 开始调试程序

    首先设置程序的启动地址,STM32默认的启动地址是从0x8000000开始的,现在我要设置程序向后偏移10K地址,也就是从0x8002800启动. 需要分两步完成上面操作: 一.Keil MDK设置: ...

  10. 垂直口风琴菜单3(jquery)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...