0
点赞
收藏
分享

微信扫一扫

多校训练4 J Average 二分

全栈顾问 2022-03-11 阅读 27
学习c++
  • 代码里我是用 a、c 数组存两个序列
    核心代码:
double eps = 1e-6;
double l = -1e6, r = 1e6;
while(r - l > eps)
{
    double mid = (r + l) / 2;
    for(int i = 0; i < n; i++)
        b[i] = a[i] - mid;
    for(int i = 0; i < n; i++)
        sum1[i] = sum1[i - 1] + b[i];
    double ans1 = -1e10, minval = 1e10;
    for(int i = L - 1; i < n; i++)
    {
        minval = min(minval, sum1[i-L]);
        ans1 = max(ans1, sum1[i] - minval);
    }
    if(ans1 > 0) l = mid;
    else r = mid;
}

accode:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 1e5 + 10;
double a[maxn], b[maxn], c[maxn];
double sum1[maxn], sum2[maxn];

int main()
{
    int n, m, L, R;
    cin>>n>>m>>L>>R;
    for(int i = 0; i < n; i++)
        scanf("%lf", &a[i]);
    for(int i = 0; i < m; i++)
        scanf("%lf", &c[i]);
    double eps = 1e-6;
    double l = -1e6, r = 1e6;
    while(r - l > eps)
    {
        double mid = (r + l) / 2;
        for(int i = 0; i < n; i++)
            b[i] = a[i] - mid;
        for(int i = 0; i < n; i++)
            sum1[i] = sum1[i - 1] + b[i];
        double ans1 = -1e10, minval = 1e10;
        for(int i = L - 1; i < n; i++)
        {
            minval = min(minval, sum1[i-L]);
            ans1 = max(ans1, sum1[i] - minval);
        }
        if(ans1 > 0) l = mid;
        else r = mid;
    }
    double ans = l;
    l = -1e6, r = 1e6;
    while(r - l > eps)
    {
        double mid = (r + l) / 2;
        for(int i = 0; i < m; i++)
            b[i] = c[i] - mid;
        for(int i = 0; i < m; i++)
            sum2[i] = sum2[i - 1] + b[i];
        double ans1 = -1e10, minval = 1e10;
        for(int i = R - 1; i < m; i++)
        {
            minval = min(minval, sum2[i-R]);
            ans1 = max(ans1, sum2[i] - minval);
        }
        if(ans1 > 0) l = mid;
        else r = mid;
    }
    ans += l;
    printf("%.10f\n", ans);
    
    return 0;
}
举报

相关推荐

0 条评论