atcoder Equal Cut

Time limit : 2sec / Memory limit : 1024MB

Score : 600 points

Problem Statement

Snuke has an integer sequence A of length N.

He will make three cuts in A and divide it into four (non-empty) contiguous subsequences B,C,D and E. The positions of the cuts can be freely chosen.

Let P,Q,R,S be the sums of the elements in B,C,D,E, respectively. Snuke is happier when the absolute difference of the maximum and the minimum among P,Q,R,S is smaller. Find the minimum possible absolute difference of the maximum and the minimum among P,Q,R,S.

Constraints

  • 4N2×105
  • 1Ai109
  • All values in input are integers.

Input

Input is given from Standard Input in the following format:

N
A1 A2  AN

Output

Find the minimum possible absolute difference of the maximum and the minimum among P,Q,R,S.


Sample Input 1

Copy
5
3 2 4 1 2

Sample Output 1

Copy
2

If we divide A as B,C,D,E=(3),(2),(4),(1,2), then P=3,Q=2,R=4,S=1+2=3. Here, the maximum and the minimum among P,Q,R,S are 4 and 2, with the absolute difference of 2. We cannot make the absolute difference of the maximum and the minimum less than 2, so the answer is 2.


Sample Input 2

Copy
10
10 71 84 33 6 47 23 25 52 64

Sample Output 2

Copy
36

Sample Input 3

Copy
7
1 2 3 1000000000 4 5 6

Sample Output 3

Copy
999999994

这题的意思是给你一个个序列,要你将这个序列分成4段(每段的元素连续),这四段每段进行累加得到4个累加和,求(最大累加和减去最小累加和)所生成的值的最小值


这题的方法是在直接枚举中间分界点,然后再在用相同的方法去枚举,如果用传统的方式,这个方法会超时。所以要进行优化界限,我们会发现界限一和界限三其实有很多重复的部分,那就是他一个会从1枚举到中间界限,另一个会从中间界限枚举到n,这些步骤中会有很多重复,所以我们只优化即可,在实时刷新结果即可以,详细见代码

#include <cstdio>
#include <algorithm>
using namespace std;
long long v[200005],k[200005];
int main() {
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%lld",&v[i]);
        k[i]=k[i-1]+v[i];
    }
    long long p[5]={0,0,0,0,0},mmin=0x7fffffff;
    int l=1,r=3;
    for(int i=2;i<n-1;i++){
        while (l<i&&abs(k[l]-k[0]-(k[i]-k[l]))>=abs(k[l+1]-k[0]-(k[i]-k[l+1]))) {
            l++;
        }
        while (r<n&&abs(k[r]-k[i]-(k[n]-k[r]))>=abs(k[r+1]-k[i]-(k[n]-k[r+1]))) {
            r++;
        }
        p[1]=k[l]-k[0];
        p[2]=k[i]-k[l];
        p[3]=k[r]-k[i];
        p[4]=k[n]-k[r];
        mmin=min(mmin,max(p[1],max(p[2], max(p[3],p[4])))-min(p[1], min(p[2], min(p[3], p[4]))));
    }
    printf("%lld\n",mmin);
    return 0;
}



猜你喜欢

转载自blog.csdn.net/aaakirito/article/details/80884168
cut