题意:
有n个银行(n<=1e5),你在每个银行都存了或者欠他们一定数量的钱,但总和为0,你只能在相邻两个银行之间进行转账操作,比如和1相邻的两个银行是2和n。求最少的转账次数。
思考此问题的过程:
一开始想到要将那些划分成不同区域,每个区域和为0,然后每有一个区域,其总的需要步骤减一,因为不需要将这部分汇入到整体的那一步。
一开始以为每次分一个区域便要进行处理(可以嵌套,可以之间有间隔)。实际上,应该按照一个值(从第一个值加到当前的值)去划分整个区域(每个区域间没有间隔,故都不需要考虑汇入时通过其他区域),有不同的值,则划分出的区域总数也不同,然后取那个划分区域最多的值,作为界限。
然后用总数减去它。
启示:做一道题,思路一定要完整,不要有点思路就上去码,思维要具有想象力。
找一段和为数a的数组段,可以将每个数依次加起来,和下标放进map里,若两数之差为下标之间的距离*a,则表明存在此段。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<map>
using namespace std;
long long money[100001];
int main()
{
int n;
while(cin>>n)
{
long long sum=0;
int coun=0;
map<long long ,int>m;
for(int i=1;i<=n;++i)
{
scanf("%lld",&money[i]);
sum+=money[i];
if(++m[sum]>coun)
coun=m[sum];
}
cout<<n-coun<<endl;
}
}