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 思维题