UVA 11054 Wine trading in Gergovia(思维)

题目链接:

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\n",ans);
33     }
34     return 0;
35 }

 

posted @ 2018-04-08 20:21  Reqaw  阅读(227)  评论(0编辑  收藏  举报