修建传送门 | ||||||
| ||||||
Description | ||||||
做为长城上的卫士,影踪派一直守在螳螂高原上防止螳螂人卡拉克西的入侵。影踪派的长城可以近似看做是一条直线上依次编号为1~N的N个基地组成,编号相邻的两个基地之间由长城相连接,而影踪派掌门祝踏岚所在的影踪禅院位于编号为1的基地。 | ||||||
Input | ||||||
第一行为一个正整数T,表示测试数据组数。 每组测试数据第一行为一个整数N(1 <= N <= 100000),第二行包含N-1个正整数,其中第i个数表示编号为i的基地与编号为i+1的基地之间的长城长度。此长度不会超过2147483647. | ||||||
Output | ||||||
对每组测试数据输出一行,仅含一个整数,表示按照最优方案建造完虫洞后,祝踏岚需要从基地1赶到的移动距离最远的基地的移动距离。 | ||||||
Sample Input | ||||||
2 3 1 20 6 1 2 3 4 5 | ||||||
Sample Output | ||||||
1 5 |
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<vector>
#include<stack>
#include<set>
#include<map>
#include<queue>
#include<algorithm>
using namespace std;
long long a[100010],sum[100010];
int main(){
int t;
scanf("%d",&t);
int i,j;
long long Max,temp;
int n;
while(t--){
scanf("%d",&n);
memset(sum,0,sizeof(sum));
for(i=2;i<=n;i++){
scanf("%lld",&a[i]);
sum[i]+=a[i]+sum[i-1];
}
i=j=1;
Max=sum[n];
while(i<=n){
while(j<i&&sum[j]<=sum[i]-sum[j])
j++;
temp = max(sum[i] - sum[j], sum[j-1]);
temp = max(sum[n] - sum[i], temp);
if(temp<Max)
Max=temp;
i++;
}
printf("%lld\n",Max);
}
return 0;
}