题目链接:
https://vjudge.net/problem/UVA-11054
/*
问题 输入村庄的个数n(2=<n<=100000)和n个村庄的数值,正代表买酒,负代表卖酒,k个单位的酒移动到相邻村需要k个单位的劳动力,
计算并输出至少需要多少个劳动力
解题思路 模拟,每个需要卖酒的村庄,向两边搜索买酒的地方,谁的多或者直接能够满足就移动谁的,直到所有村庄均满足条件。
最坏的情况下,每个村庄都搜索到最远,n*n,可能超时,另外不可行,因为搜索的时候先后的顺序很难确定,需要一个最优值。所以
不可行。
分析:考虑最左边的村庄,不论是买酒还是卖酒,需要的劳动力个数相邻移位总是需要a1个,此时a1变为0,向后面走,不论a2买酒
还是卖酒,当前的值为a1+a2,需要的劳动力个数是|a1+a2|,a2变为0,如此a3当前的值为a1+a2+a3,所需要的劳动力个数是|a1+a2+a3|,
a3变为0。依次类推将每个村庄所需的劳动力个数为|a1| + |a1+a2| + |a1+a2+a3| + |a1+a2+...+an|,借助一个中间变量last,
last = a1 i=1,
last = ai+ai-1,i>1;
则答案为|last|依次累加即可。
*/
#include<cstdio>
#include<cmath> int main()
{
int n,i;
long long ans,a,last;
while(scanf("%d",&n), n != ){ scanf("%lld",&a);
last = a;
ans = abs(last); for(i=;i<=n;i++){
scanf("%lld",&a);
last += a;
ans += abs(last);
}
printf("%lld\n",ans);
}
return ;
}