Codeforces Round #353 (Div. 2) C. Money Transfers
Posted insaneman
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #353 (Div. 2) C. Money Transfers相关的知识,希望对你有一定的参考价值。
题目大意:某个人在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的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #353 (Div. 2) A. Infinite Sequence
[Codeforces] Round #353 (Div. 2)
Codeforces Round #353 (Div. 2) A. Infinite Sequence 思维题
Codeforces Round #353 (Div. 2) ABCDE 题解 python
Codeforces Round #353 (Div. 2)
Codeforces Round #353 (Div. 2) B. Restoring Painting __ map or set 思维题