Codeforces Round #353 (Div. 2) C. Money Transfers 数学
C. Money Transfers
链接:
http://www.codeforces.com/contest/675/problem/C
题意
现在有n个银行,每个银行有a[i]元,可以像周围的银行转移钱
你的目标是使得所有银行钱的个数都是0,问你最少操作多少次
题解:
原题,hdu 2590
考虑一个连续的段,长度为l,如果该段的区间和为0的话,那么就操作l-1次就够了
现在有n个数,你分成了k段,那么你就需要操作n-k次
那么只要k最大就好了
然后暴力枚举前缀和相等的,取最大就好了
代码:
1 #include<iostream> 2 #include<algorithm> 3 #include<map> 4 using namespace std; 5 typedef long long ll; 6 const int maxn = 1e5 + 7; 7 int a[maxn]; 8 map<ll, ll>cnt; 9 int main() 10 { 11 int n; 12 cin >> n; 13 for (int i = 1; i <= n; i++) cin >> a[i]; 14 ll sum = 0, mx = 0; 15 for (int i = 1; i <= n; i++) 16 { 17 sum += a[i]; 18 cnt[sum]++; 19 mx = max(mx, cnt[sum]); 20 } 21 cout << n - mx << endl; 22 }