zoukankan      html  css  js  c++  java
  • Weakness and Poorness CodeForces

    You are given a sequence of n integers a1, a2, ..., an.

    Determine a real number x such that the weakness of the sequence a1 - x, a2 - x, ..., an - x is as small as possible.

    The weakness of a sequence is defined as the maximum value of the poorness over all segments (contiguous subsequences) of a sequence.

    The poorness of a segment is defined as the absolute value of sum of the elements of segment.

    Input

    The first line contains one integer n (1 ≤ n ≤ 200 000), the length of a sequence.

    The second line contains n integers a1, a2, ..., an (|ai| ≤ 10 000).

    Output

    Output a real number denoting the minimum possible weakness of a1 - x, a2 - x, ..., an - x. Your answer will be considered correct if its relative or absolute error doesn't exceed 10 - 6.

    Example

    Input
    3
    1 2 3
    Output
    1.000000000000000
    Input
    4
    1 2 3 4
    Output
    2.000000000000000
    Input
    10
    1 10 2 9 3 8 4 7 5 6
    Output
    4.500000000000000

    Note

    For the first case, the optimal value of x is 2 so the sequence becomes  - 1, 0, 1 and the max poorness occurs at the segment "-1" or segment "1". The poorness value (answer) equals to 1 in this case.

    For the second sample the optimal value of x is 2.5 so the sequence becomes  - 1.5,  - 0.5, 0.5, 1.5 and the max poorness occurs on segment "-1.5 -0.5" or "0.5 1.5". The poorness value (answer) equals to 2 in this case.

    The poorness:连续子序列的和的绝对值。

    题解:ternary searc(三分查找)https://www.cnblogs.com/whywhy/p/4886641.html,很典型的三分题。x取极值时最小,否则都会增大,所以是一个凹函数。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 
     4 const int maxn=2e5+5;
     5 
     6 int n;
     7 int a[maxn];
     8 
     9 double maxSum(double A[]){
    10     double ans=0,tem=0;
    11     for(int i=1;i<=n;i++){
    12         tem+=A[i];
    13         if(tem<0) tem=0;
    14         ans=max(ans,tem);
    15     }
    16     return ans;
    17 }
    18 
    19 double compute(double x){
    20     double b[maxn];
    21     for(int i=1;i<=n;i++) b[i]=a[i]-x;
    22     double ans1=maxSum(b);
    23     for(int i=1;i<=n;i++) b[i]=-b[i];
    24     double ans2=maxSum(b);
    25     return max(ans1,ans2);
    26 }
    27 
    28 int main()
    29 {   scanf("%d",&n);
    30     for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    31     double l=-1e4,r=1e4;
    32     for(int i=1;i<=100;i++){
    33         double midl=(2*l+r)/3.0;
    34         double midr=(2*r+l)/3.0;
    35         if(compute(midl)<compute(midr)) r=midr;
    36         else l=midl;
    37     }
    38     printf("%.7f
    ",compute(r));
    39 } 
  • 相关阅读:
    洛谷p1017 进制转换(2000noip提高组)
    Personal Training of RDC
    XVIII Open Cup named after E.V. Pankratiev. Grand Prix of Eurasia
    XVIII Open Cup named after E.V. Pankratiev. Grand Prix of Peterhof.
    Asia Hong Kong Regional Contest 2019
    XVIII Open Cup named after E.V. Pankratiev. Grand Prix of Siberia
    XVIII Open Cup named after E.V. Pankratiev. Ukrainian Grand Prix.
    XVIII Open Cup named after E.V. Pankratiev. GP of SPb
    卜题仓库
    2014 ACM-ICPC Vietnam National First Round
  • 原文地址:https://www.cnblogs.com/zgglj-com/p/7875629.html
Copyright © 2011-2022 走看看