Gergovia的酒交易B805(移動紙牌)
阿新 • • 發佈:2017-05-06
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 ifGergovia的酒交易B805(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(移動紙牌)