博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P2115 [USACO14MAR]破坏Sabotage
阅读量:5255 次
发布时间:2019-06-14

本文共 1169 字,大约阅读时间需要 3 分钟。

  主要思想就是二分答案,关键在于如何判断二分的平均值是否可行。

  

  在这里之间利用洛谷题解推导过程@communist,因为我没找到这些符号怎么打……

  ans就是二分的平均值,那么假设存在更好的或者等于的,满足第一个式子,即可得到最后一个。

  那么只要每一次线性求出每个点对应的最小前缀,最小后缀,判断是否有一组满足最后一个式子即可。

  O ( n log(n) ) ,加上一点常数。 

  代码:

#include
#include
#include
#include
#include
#include
using namespace std;#define maxn 100005const double inf=999999999.0;const double eps=1e-6;double sumf[maxn],sumb[maxn],mf[maxn],mb[maxn],now[maxn],a[maxn];int n;int check(double x){ mf[0]=mf[n+1]=mb[0]=mb[n+1]=inf; for(int i=1;i<=n;i++) { mf[i]=mb[i]=inf; now[i]=a[i]-x; } for(int i=1;i<=n;i++) { sumf[i]=sumf[i-1]+now[i]; mf[i]=min(mf[i-1],sumf[i]); } for(int i=n;i>=1;i--) { sumb[i]=sumb[i+1]+now[i]; mb[i]=min(mb[i+1],sumb[i]); } for(int i=1;i<=n-2;i++) if(mf[i]+mb[i+2]<=0) return 1; return 0;}int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%lf",&a[i]); double L=1,R=10000; double ans; while(L+eps<=R) { double mid=(L+R)/2; if(check(mid)) { ans=mid; R=mid-eps; } else L=mid+eps; } printf("%.3lf\n",ans); return 0;}

 

转载于:https://www.cnblogs.com/popo-black-cat/p/10854024.html

你可能感兴趣的文章
多线程 测试
查看>>
web提前做好测试
查看>>
tp5.1 本地正常, 线上route.php不起作用的问题
查看>>
[笔记] 斯特林公式
查看>>
空指针的解决方案Optional包装类
查看>>
opencv删除轮廓
查看>>
简谈【自动化协议逆向工程技术的当前趋势】
查看>>
Leetcode 127
查看>>
Leetcode 1004. 最大连续1的个数 III
查看>>
OpenJudge1001Exponentiation
查看>>
2018.4.2 看k&r
查看>>
实战分区表:SQL Server 2k5&2k8系列(三)
查看>>
JS简单的倒计时(代码优化)
查看>>
CSS2.0实现面包屑
查看>>
css font的简写规则
查看>>
CSS| 框模型-輪廓
查看>>
kafka报错 Replication factor: 3 larger than available brokers: 0.
查看>>
linux查看和修改PATH环境变量的方法
查看>>
浅谈自定义UITextField的方法
查看>>
笔记本设置无线热点
查看>>