cf 320# Weakness and Poorness(三分+最大连续和)

编程入门 行业动态 更新时间:2024-10-08 13:36:24

<a href=https://www.elefans.com/category/jswz/34/1764991.html style=cf 320# Weakness and Poorness(三分+最大连续和)"/>

cf 320# Weakness and Poorness(三分+最大连续和)

题目:

题意:给定n个数,找一个实数x,然后n个数都减去x,使得ans=max(|最小连续和|,|最大连续和|)最小。求ans。

分析:啊,印象中的第一个三分。|最大连续和|与x逆增长,|最小连续和|与x正增长,形成抛物线,三分x就行了。
代码:

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn = 2e5+6;
double a[maxn];
double cal(int n)
{double ret1=0,temp=0;for(int i=1;i<=n;i++){if(temp>0)temp+=a[i];elsetemp=a[i];if(temp>ret1)ret1=temp;a[i]=-a[i];}double ret2=0;temp=0;for(int i=1;i<=n;i++){if(temp>0)temp+=a[i];elsetemp=a[i];a[i]=-a[i];if(temp>ret2)ret2=temp;}return max(ret1,ret2);
}void pro(int n,double x)
{for(int i=1;i<=n;i++)a[i]-=x;
}double Find(int n)
{double down=-10000.0,mid,midmid,up=10000.0,ret=1e18;for(int i=1;i<=500;i++){mid=(down+up)/2.0;midmid=(mid+up)/2.0;pro(n,mid);double temp1=cal(n);pro(n,-mid);pro(n,midmid);double temp2=cal(n);pro(n,-midmid);if(temp1<temp2)up=midmid;elsedown=mid;ret=min(ret,temp1);ret=min(ret,temp2);}return ret;
}int main()
{int n,i,j;scanf("%d",&n);for(i=1;i<=n;i++)scanf("%lf",&a[i]);printf("%.12lf\n",Find(n));return 0;
}
/*int main()
{int n,i,j;double x,mx,mn;while(scanf("%d",&n)!=EOF){mx=-1e9;mn=1e9;for(i=1;i<=n;i++){scanf("%lf",&a[i]);if(a[i]>mx)mx=a[i];if(a[i]<mn)mn=a[i];}for(double i=mn;i<=mx;i+=0.1){pro(n,i);printf("%lf\n",cal(n));pro(n,-i);}}return 0;
}
*/


更多推荐

cf 320# Weakness and Poorness(三分+最大连续和)

本文发布于:2024-02-13 10:34:10,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1758014.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:cf   Poorness   Weakness

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!