YTU OJ 3312 : Four Segments

版权声明:欢迎大佬批评指正!O(∩_∩)O https://blog.csdn.net/wyh1618/article/details/82939743

3312 : Four Segments

题目描述

您将获得一个包含n个整数的数组。设sum(l,r)是区间[l,r)位置上所有数字的总和(计算第l个元素,不计算第r个元素)。0≤l≤r≤n。数组中的索引从0开始编号。 

  

例如,如果a = [-5,3,9,4],则sum(0,1)= -5,sum(0,2)= -2,sum(1,4)= 16 

  

选择三个界限符delim0,delim1,delim2(0≤delim0≤delim1≤delim2≤n)和以这样的方式划分阵列的值res = sum(0, delim0) - sum(delim0, delim1) + sum(delim1, delim2) - sum(delim2, n)。让res的值最大。 

输入

第一行包含一个整数n(1≤n≤5000). 

第二行包含n号码一个a0, a1, ..., an-1 (-10^9≤ai≤10^9). 

输出

选择的三个界限符,使res的值最大。如果有多个答案,请打印字典序最小的。 

样例输入

3

-1 2 3

样例输出

0 1 3

思路:

        先求出前缀和,化简上面的式子,可以了解只需要求出三个分界点的前缀和最大。 简言之 求a[i]+a[k]-a[j]的最大值

所以暴力先找j,然后0~j,然后再j~n。就OK啦!

#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <stdio.h>
long long int  ans=-1e9;
using namespace std;
int main()
{
    int i,j,k;
    long long int a[5010];
    a[0]=0;
    int n,m,t;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        scanf("%d",&t);
        a[i]=a[i-1]+t;
    }
    /*for(i=0;i<=n;i++)
        cout<<a[i]<<endl;*/
    int t1,t2;
    int d1,d2,d3;
    for(j=0;j<=n;j++)
    {
        t1=0;
        for(i=0;i<=j;i++)
        {
            if(a[i]>a[t1])
            {
                t1=i;
            }
        }
        t2=j;
        for(k=j;k<=n;k++)
        {
            if(a[k]>a[t2])
            {
                t2=k;
            }
        }
        if(a[t1]+a[t2]-a[j]>ans)
        {
            ans=a[t1]+a[t2]-a[j];
            d1=t1;
            d2=j;
            d3=t2;
        }
    }
    printf("%d %d %d",d1,d2,d3);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/wyh1618/article/details/82939743