题目描述
小明在越南旅游,参加了当地的娱乐活动。小明运气很好,拿到了大奖, 到了最后的拿奖金环节。小明发现桌子上放着一列红包,每个红包上写着奖金数额。
现在主持人给要求小明在这一列红包之间“切”2刀,将这一列红包“切”成3组,并且第一组的奖金之和等于最后一组奖金和(允许任意一组的红包集合是空)。最终第一组红包的奖金之和就是小明能拿到的总奖金。小明想知道最多能拿到的奖金是多少,你能帮他算算吗。
举例解释:桌子上放了红包 1, 2, 3, 4, 7, 10。小明在“4,7”之间、“7,10” 之间各切一刀,将红包分成3组 [1, 2, 3, 4] [7] [10],其中第一组奖金之和=第三组奖金之和=10,所以小明可以拿到10越南盾。
输入描述:
第一行包含一个正整数n,(1<=n<= 200 000),表示有多少个红包。 第二行包含n个正整数d[i],表示每个红包包含的奖金数额。其中1<= d[i] <= 1000 000 000
输出描述:
小明可以拿到的总奖金
示例1
输入
复制
5 1 3 1 1 4
输出
复制
5
说明
[1,3,1] [ ] [1,4] ,其中第一组奖金和是5,等于第三组奖金和。所以小明可以拿到5越南盾
示例2
输入
复制
5 1 3 2 1 4
输出
复制
4
说明
[1,3] [2,1] [4],小明可以拿到4越南盾
示例3
输入
复制
3 4 1 2
输出
复制
0
说明
[ ] [4, 1, 2] [ ] ,小明没办法,为了保证第一组第三组相等,只能都分成空的。所以小明只能拿到0越南盾。
思路:
从左和从右分别依次计算和,当左和大于右和时,左边多加一个数;当右和大于左和时,右边多加一个数;左和等于右和时记录最大和,直到左边下标标记大于右边下标标记。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
long []a = new long[200500];
for (int i = 0; i < n; i++) {
a[i] = in.nextInt();
}
int l = 0;
int r = n-1;
long suml = a[0];
long sumr = a[r];
long maxsum = 0;
while (l<=r)
{
if(suml==sumr){
l++;
r--;
maxsum = suml;
suml+=a[l];
sumr+=a[r];
}else
{
if(suml<sumr){
l++;
suml+=a[l];
}else
{
r--;
sumr+=a[r];
}
}
}
System.out.println(maxsum);
}
}