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