1. 程式人生 > >Gergovia的酒交易B805(移動紙牌)

Gergovia的酒交易B805(移動紙牌)

alt int 直線 sys logs 線上 put div break

試題描述

直線上有 n 個等距的村莊,每個村莊要麽買酒,要麽賣酒。設第 i 個村莊對酒的需求為 ai (-1000<=ai<=1000),其中ai>0表示買酒,ai<0表示賣酒。所有村莊供需平衡,即所有 ai 之和等於0。把 k 個單位的酒從一個村莊運到相鄰村莊需要 k 個單位的勞動力。計算最少需要多少勞動力可以滿足所有村莊的需求。輸出保證在 64 位帶符號整數的範圍內。

輸入
若幹組數據,每組數據為兩行。
對於每組數據,第一行有一個整數N,表示有N個酒窖,第二行有N個整數,從a1,a2一直到an。
輸入的最後以0結尾。
輸出
每組數據一行,每行一個整數,表示總費用。
輸入示例
10
3 -1 -2 9 -4 -1 -7 9 -7 1
5
1000 -1000 1000 0 -1000
0
輸出示例
33
3000
其他說明
數據範圍:2 <= n <= 100 000

大概的思路:從最左邊的往右推。因為線性村莊中最左邊的酒一定要往右邊運。所以,把當前走過的村莊的絕對值加起來,再加上當前村莊的(可以是負數),即為簡單算法。具體見代碼。

技術分享
 1 #include <iostream>
 2 #include <cmath>
 3 #include <cstring>
 4 #include <cstdio>
 5 #include <cstdlib>
 6 #include <algorithm>
 7 using namespace std;
 8 int a[1010101];
 9 int main()
10 {
11     int n;
12     while(cin>>n)
13     {
14         if
(n==0) break; 15 for(int i=1;i<=n;i++) scanf("%d",&a[i]); 16 int m=a[1],ans=0; 17 for(int i=2;i<=n;i++) 18 { 19 ans+=abs(m); 20 m+=a[i]; 21 } 22 printf("%d\n",ans); 23 } 24 //system("pause"); 25 return 0; 26 }
Gergovia的酒交易B805

Gergovia的酒交易B805(移動紙牌)