版权声明:欢迎大佬批评指正!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;
}