题目链接:http://www.codeforces.com/problemset/problem/675/C
题意:
有n个银行,每个银行有一个账户,账上的钱可能为负或正或0,且n个银行账户的钱和为0,两个相邻银行的账户可以互相转账,1和n也可以,相当于一个圈。
求最少转多少次可使每个账户上的钱都变成0。
思路:
很明显最多转n-1次就可以满足要求了,即随便选一个点,把每个点的值依次加到下一个点,直到该点的前一个点。
那么假如中间有一段和为0的,假如长度为l,那么次数只要l-1,所以每多一个这样的段总数就可以减少1。
那么就是找出最多的中间和为0的段的数量就可以了。
1 #include <bits/stdc++.h> 2 using namespace std; 3 int n; 4 int a[100010]; 5 long long sum; 6 int main() 7 { 8 // freopen("in.txt", "r", stdin); 9 // freopen("out.txt", "w", stdout); 10 while(~scanf("%d", &n)) 11 { 12 sum = 0; 13 for(int i = 1; i <= n; i++) scanf("%d", &a[i]); 14 15 map <long long, int> mp; 16 mp[0] = 1; 17 int ans = 1; 18 for(int i = 1; i < n; i++) 19 { 20 sum += a[i]; 21 mp[sum]++; 22 if(mp[sum] >= ans) ans = mp[sum]; 23 } 24 printf("%d\n", n-ans); 25 } 26 return 0; 27 }