1 solutions

  • 0
    @ 2024-9-20 23:45:09

    由于每次都是对字段和的操作,那么我们用前缀和。

    然后二分答案找到最大的平均数。 这个时候我们还可以有一个操作。

    每次二分得到的mid,我们把a数组每个数字都减去mid,然后进入二分函数判断最大的字段和是不是≥0即可。

    #include<bits/stdc++.h>
    using namespace std;
    
    const int N = 1e6+11;
    
    int n, L;
    double a[N], b[N], s[N];
    
    bool cheek(){
        double maxx = -1, minn = 1e10;
        for(int i=L;i<=n;i++){
            minn = min(minn, s[i-L]);
            maxx = max(maxx, s[i] - minn);
        }return maxx >= 0;
    }
    
    int main(){
        scanf("%d%d",&n,&L);
        for(int i=0;i<n;i++)scanf("%lf",&a[i]);
        
        double l = -1, r = 2002, dep = 1e-5;
        while(r - l > dep){
            double mid = (l + r) / 2;
            for(int i=0;i<n;i++) b[i] = a[i] - mid;
            for(int i=0;i<n;i++) s[i+1] = s[i] + b[i];
            if(cheak()) l = mid;
            else r = mid;
        }
        
        r *= 1000;
        int ans = r;
        
        printf("%d\n",ans);
        return 0;
    }
    
    • 1

    Information

    ID
    486
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    9
    Tags
    # Submissions
    7
    Accepted
    3
    Uploaded By