博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
codeforces 578c - weekness and poorness - 三分
阅读量:4506 次
发布时间:2019-06-08

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

2017-08-27 17:24:07

writer:pprp

题意简述:

• Codeforces 578C Weakness and poorness

• 给定一个序列A
• 一个区间的poorness定义为这个区间内和的绝对值
• weakness等于所有区间最大的poorness
• 求一个x使得,序列A全部减x后weakness最小
• 1 ≤ n ≤ 2 * 1e5

 

这里用到了最大连续区间的和的知识点·,可以看上一篇博客

通过三分找最小值

AC代码如下:

/*@theme:myprogramme codeforces 578c@writer:pprp@declare:三分的思想@date:2017/8/27*/#include 
using namespace std;int n;const int maxn = 2e6+100;double a[maxn], b[maxn];const double eps = 3e-12;//找到连续区间大和double maxSum(double a[]){ double ans = 0, tmp = 0; for(int i = 0; i < n ; i++) { tmp = max(0.0,tmp) + a[i]; ans = max(ans, tmp); } return ans;}//对三分的结果进行判断double calc(double x){ for(int i= 0 ; i < n ; i++) { b[i] = a[i] - x; } double as1 = maxSum(b); for(int i= 0 ; i < n ; i++) { b[i] *= -1; } double as2 = maxSum(b); return max(as1, as2);}//三分查找double Search(){ double l = -1e4, r = 1e4; double m, mm; while(r - l > eps) { m = (l*2 + r)/3.0; mm = (r*2 + l)/3.0; double as1 = calc(m); double as2 = calc(mm); if(as1 < as2) r = mm; else l = m; } //找到r对应的区间和最大 return calc(r);}int main(){ scanf("%d", &n); for(int i = 0 ; i < n ; i++) cin >> a[i]; printf("%.15f\n",Search()); return 0;}

 

转载于:https://www.cnblogs.com/pprp/p/7440904.html

你可能感兴趣的文章
数据可视化视频制作
查看>>
mysql 数据备份。pymysql模块
查看>>
FactoryMethod模式——设计模式学习
查看>>
Android中 AsyncTask
查看>>
原码、反码、补码和移码
查看>>
SQL存储过程与函数的区别
查看>>
@Resource和@Autowired区别
查看>>
VS2010打开就自动关闭问题解决
查看>>
持续部署之jenkins与gitlab(三)
查看>>
第二章 Jenkins安装与配置
查看>>
POJ 3169 Layout 差分约束系统
查看>>
IOS 缩放图片常用方法
查看>>
软件工程课
查看>>
Pycharm-连接服务器
查看>>
[Leetcode] The Skyline Problem
查看>>
okhttp异步请求流程和源码分析
查看>>
【集合框架】JDK1.8源码分析之Comparable && Comparator(九)
查看>>
Flutter之内置动画(转)
查看>>
uni-app中onLoad不起作用
查看>>
多线程概述
查看>>