题意:
n个负担着不同债务的银行围成环,每次每个银行只能向自己左边或者右边的银行转移资金。所有银行的债务和为0,问你最少转移多少次能让所有银行债务都为0。
分析:
n个银行,最多n-1次即可将所有银行债务变为0,即按顺序从第一个开始向后一个银行转移债务即可,到第n个时所有债务必为0。
在此转移过程中可以发现任何一个为0的区间都可以减少1次转移,即该区间和为0时,右边界不需要向后一个银行继续转移债务。
数出存在多少个0区间即可得到答案为n-0区间个数。
假设区间[i,j]和为0,那么[1,i-1]的区间和与[1,j]和相同。
通过map存下区间和大小出现的次数,即可得到哪些区间为0。
但从1-n递推时是否没考虑到环?由于计算[1,x](x从1-n)的区间和并存入map中,因此存在环的情况并不影响和的出现。
思路来自:http://m.blog.csdn.net/article/details?id=51438865
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cstdlib>
#include <string>
#include <fstream>
#include <vector>
#include <cstdio>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
using namespace std;
#define INF 0x3f3f3f3f
const int N=100005;
const int mod=1e9+7;
int a;
map<long long, int> findsum;
int main() {
int n;
long long sum=0;
int ans=0;
cin>>n;
for (int i=0; i<n; i++) {
scanf("%d",&a);
sum+=a;
ans=max(ans, ++findsum[sum]);
}
cout<<n-ans<<endl;
return 0;
}