1. 程式人生 > >HAUT校賽--最大奇子段和

HAUT校賽--最大奇子段和

問題 G: 最大子段和

時間限制: 1 秒  記憶體限制: 64 MB
提交: 42  解決: 10
提交 狀態 

題目描述

一個大小為n的陣列a1到an(−10^4≤ai≤10^4)。請你找出一個連續子段,使子段長度為奇數,且子段和最大。

輸入

第一行為T(1≤T≤5),代表資料組數。
之後每組資料,第一行為n(1≤n≤10^5),代表陣列長度。
之後一行n個數,代表a1到an

輸出

每組資料輸出一行,表示滿足要求的子段和最大值

樣例輸入

1
4
1 2 3 4

樣例輸出

9
#include<stdio.h>
#include<algorithm>
using namespace std;
int a[100005];
int main(void)
{
	int T, n, i, sum, ans;
	scanf("%d", &T);
	while(T--)
	{
		scanf("%d", &n);
		for(i=1;i<=n;i++)
			scanf("%d", &a[i]);
		ans = sum = a[1];
		for(i=2;i<=n-1;i+=2)		/*兩個兩個滴加*/
		{
			sum += a[i]+a[i+1];
			if(sum<a[i+1])				/*這裡不是sum<0因為你刪除的時候也要兩個兩個刪除,所以你要保留最後一個!也就是和最後一個比較當前大小*/
				sum = a[i+1];
			ans = max(ans, sum);
		}
		sum = a[2];			/*兩個不同起點*/
		for(i=3;i<=n-1;i+=2)
		{
			sum += a[i]+a[i+1];
			if(sum<a[i+1])
				sum = a[i+1];
			ans = max(ans, sum);
		}
		printf("%d\n", ans);
	}
	return 0;
}