http://codeforces.com/contest/675/problem/C
题意:
n个银行形成环,一个人在每个银行资产有正有负,现在要求相邻银行之间可以转移资产,使得最后每个银行资产为零。
保证sum=0,求最小转移次数
首先最坏的情况,从第一个银行一直转移到最后一个银行,这样的话 最小转移次数=n-1
如果我们找到一个区间的区间和为零,那么就把原序列划分成两个区间,总的最小转移次数=n-2
以此类推,找到越多区间和为零的不相交小区间,最小转移次数就越少。
怎么找最多的零区间呢?
假设第一个环是从i开始的,那么前缀和S【i】==S【j】表示区间【i+1,j】的和为0,那么下一个环必然是从j+1开始,下一个环的右端点必然是k,满足S【k】==S【j】,同理以后的环都是S【k1】=S【k2】=S【i】....
也就是我们只需要看有多少前缀和值等于s[i],就能找到第一个环从i开始的情况下,能找到最多的零区间
所以我们要找最多的零区间,就变成找所有的前缀和里 重复次数最多的一个
复杂度nlogn
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include<stack>
using namespace std;
map<long long ,int>mp;
int main()
{
int n;
cin>>n;
long long sum=0;
int x,ans=0;
for (int i=1; i<=n; i++)
{
scanf("%d",&x);
sum+=x;
mp[sum]++;
ans=max(ans,mp[sum]);
}
printf("%d\n",n-ans);
return 0;
}