题目大意:某个人在N个银行的存款和借款总和为0,这N个银行排成一个圆环,每次转账只能在相邻的两个银行之间进行。问进行多少次转账能使每个银行的存款为0.
题目保证总和一定是0。
有两个理论基础需要先说明。
一个总和为0的长度为N的区间内至多转账N-1次就可以使每个账户存款为0。因此只要找出总和为0的区间个个数最多设为W,那么答案就是N-W
一个区间总和为零的充要条件是,第一个元素之前的前缀和等于最后一个元素截止的前缀和。
#include <iostream>
#include <map>
using namespace std;
map<long long,int> counter;
int bank[100005];
int main(int argc, const char * argv[]) {
int N,ans;
long long sum=0;
scanf("%d",&N);
ans=0;
for(int i=0;i<N;i++) {
scanf("%d",&bank[i]);
sum+=bank[i];
if(counter.count(sum)<1)//先查看sum这个key值是否存在,防止直接引用下标出错,其实map会赋默认值为0的
counter[sum]=1;
else
counter[sum]++;
ans=max(ans,counter[sum]);
}
cout<<N-ans;
return 0;
}
Codeforces Round #353 (Div. 2) C. Money Transfers
原文:http://www.cnblogs.com/modengdubai/p/5540648.html