CodeForces 578C Weakness and Poorness 二分
2015-09-19 22:29
495 查看
题意:确定一个x使序列a1-x,a2-x,...,an-x的weakness最小,输出最小weakness。(weakness是连续子序列的和的绝对值的最小值)
解法:以前对二分的理解就是二分答案,上下界分别在目标解的两侧,其中一个满足一个不满足。这个题值得自己反思了。
正解二分X,目标情况的X值应该是这段序列的连续子序列的最大值和最小值的和逼近0。
代码:
解法:以前对二分的理解就是二分答案,上下界分别在目标解的两侧,其中一个满足一个不满足。这个题值得自己反思了。
正解二分X,目标情况的X值应该是这段序列的连续子序列的最大值和最小值的和逼近0。
代码:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn = 200005; const double eps = 1e-12; const double inf = 1e10; int n,a[maxn];double dp[2][maxn]; int main(){ int i,j; scanf("%d",&n); for(i = 0;i < n;i++) scanf("%d",&a[i]); double t1,t2,mid,lb = -20000,rb = 20000; while(rb-lb>eps){ mid = (lb+rb)/2; for(i = 0;i < n;i++) dp[0][i] = t1 = -inf,dp[1][i] = t2 = inf; for(i = 0;i < n;i++){ dp[0][i] = i?max(a[i]-mid,dp[0][i-1]+a[i]-mid):a[i]-mid; dp[1][i] = i?min(a[i]-mid,dp[1][i-1]+a[i]-mid):a[i]-mid; t1 = max(t1,dp[0][i]);t2 = min(t2,dp[1][i]); } //printf("%.6f %.6f %.6f\n",t1,t2,mid); if(t1+t2>0) lb = mid; else rb = mid; } printf("%.9f\n",t1); return 0; }
相关文章推荐
- 2015 ACM/ICPC Asia Regional Shenyang Online(1002)
- HDOJ 1847 Good Luck in CET-4 Everybody!(巴什博奕)
- C++基础知识(二)
- [Excel]鼠标右键菜单没有新建Word、Excel、PPT怎么办?
- 中国最会赚钱人必备的十大习惯
- HDU 5463 贪心
- 地图
- handler------post传送方式
- PDB文件:每个开发人员都必须知道的
- 前端性能优化指南
- poj1611The Suspects(并查集)
- 2563:统计问题
- iOS:沙盒、偏好设置、归档、解归档
- handler通信机制
- 2015 ACM/ICPC Asia Regional Shenyang Online(1006)
- 同时支持三个MySQL+SQLite+PDO的PHP数据库类
- boost asio
- JavaEE系列之(一)JSP基础知识详解
- 内部存储 openFileInputStream openFileOutputStream
- 初心莫负