Codeforces Round #645 (Div. 2)(E 思维 妙题)

题目链接

E. Are You Fired?

题意:给你一个n,前(n+1)/2个数输入给你,后n/2(向下取整) 个数都是x,(-10^9<=x<=10^9),现在要你求一个k,使得数组内所有连续子序列长度为k的和大于0.

参考做法来自:博客

做法:

相当于枚举后缀和(i从1开始)。如果有一种方法可以枚举所有的区间就好了,但是不行,会超时。

枚举左端点,右端点是n。然后左端点右移,前面的所有区间能同时左移取最小值,太麻烦了,直接取前面所有区间最小值右区间左移就行了(这样 就相当于枚举了所有长度为 当前区间长度 并求的最小值了,妙啊)。

#include<bits/stdc++.h>
#define lowbit(i) i&(-i)
using  namespace std;
typedef long long ll;
const int N=1e6+6;
const ll inf=1e18;
int n;
ll k;
ll a[N],sum[N];
ll solve(int x){
    return sum[k]-sum[x-1];
}
int main(){

    scanf("%d",&n);
    k=(n+1)/2;
    for(int i=1;i<=k;i++){
        scanf("%lld",&a[i]);
        sum[i]=sum[i-1]+a[i];
    }
    int x;
    scanf("%d",&x);
    ll minn=inf;
    ll ans=-1;
    ll half=1ll*n/2;
    for(int i=1;i<=k;i++){
        ll tmp=solve(i)+half*x;
        if(minn==inf)
            minn=tmp;
        else{
            minn-=x;
            minn=min(minn,tmp);
        }
        
        if(minn>0)
            ans=n-i+1;
    }
    printf("%lld\n",ans);
    return 0;
}
/*
8
-10 -9 -8 -7 2 2 2 2
*/ 

猜你喜欢

转载自blog.csdn.net/qq_41286356/article/details/106412694