码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces Round #353 (Div. 2) C. Money Transfers

时间:2016-05-29 23:16:52      阅读:164      评论:0      收藏:0      [点我收藏+]

标签:

题目大意:某个人在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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!