题目大意:某个人在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; }
时间: 2024-10-29 04:36:43