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

题目链接:

http://www.codeforces.com/contest/675/problem/C

题意:

给一个数组,每个数与他相邻的数相连,第一个与最后一个相连,每个数的数值可以左右移动,问最少的移动次数使所有的数都为零。

题解:

把数组分成若干个部分,每个部分和都为0,每部分最多移动len-1,这样分的越多,得到的结果就越优。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
using namespace std;

const int maxn=101010;
typedef __int64 LL;

int n;
LL sum[maxn];
int arr[maxn];
map<LL,int> mp;

void init(){
    mp.clear();
}

int main(){
    while(scanf("%d",&n)==1&&n){
        init();
        for(int i=1;i<=n;i++){
            scanf("%d",arr+i);
        }
        sum[1]=arr[1];
        mp[sum[1]]++;
        int ma=1;
        for(int i=2;i<=n;i++){
            sum[i]=sum[i-1]+arr[i];
            mp[sum[i]]++;
            if(mp[sum[i]]>ma) ma=mp[sum[i]];
        }
        int ans=n-ma;
        printf("%d
",ans); 
    } 
    return 0;
} 
原文地址:https://www.cnblogs.com/fenice/p/5536060.html