模拟祭-比萨-题解O(n)

把圆拆成条

其中的一个特殊块

是两头块的加和

用3个指针

边遍历,边找最小块的最大值

于是就出来了

#include<cstdio>
#include<iostream>
#define maxn 100010
using namespace std;
long long n,a[maxn],minn,sum[maxn];
int main()
{
    scanf("%lld",&n);
    for(int i=1; i<=n; i++)
    {
        scanf("%lld",&a[i]);
        sum[i]=sum[i-1]+a[i];
    }
    int t1=1,t2=2,t3=3;
    for(int i=1; i<=3*n; i++)
    {
        if(t2>t3) swap(t2,t3);
        if(t1>t2) swap(t1,t2);
        long long ans1=sum[t2]-sum[t1];
        long long ans2=sum[t3]-sum[t2];
        long long ans3=sum[n]-sum[t3]+sum[t1];
        long long pp=min(ans1,min(ans2,ans3));
        if(pp>minn) minn=pp;
        if(pp==ans2)
        {
            t3++;
            if(t3>n) t3=1;
        }
        else if(pp==ans1)
        {
            t2++;
            if(t2>n) t2=1;
        }
        else if(pp==ans3)
        {
            t1++;
            if(t1>n) t1=1;
        }
    }
    printf("%lld",minn);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/darlingroot/p/10438186.html