本题让我们用数组a保存每个银行的余额,因为所有余额的和加起来一定为0,所以我们能把整个数组a划分为几个区间,每个区间的和都为0。对于每个区间来说,设该区间长度为l,则让该区间都为0的操作数为l-1,例如:1 、1 、-3 、1的操作数为3,也就是说,若把a分成k个区间,则a所需要的总的操作数为n-k。
本题是一个移动求最小步骤的问题
数据单元组成了一个圈 之后记录的是出现次数最多的某个前缀和 就是划分的区域数喽!
很巧妙的解决了圈的问题。
#include<iostream>
#include<map>
#include<algorithm>
using namespace std;
inline int min(int re, int t)
{
if (re < t)
return re;
else
{
return t;
}
}
int main() {
int n;
cin >> n;
long long sum = 0;
int t;
int results = n - 1;
map<long long, int> mp;
for (int i = 0; i < n; i++)
{
cin >> t;
sum += t;
mp[sum]++;
results = min(results, n - mp[sum]); //这里很重要,个人感觉就是当首尾组合的时候就会产生非零,并且
//已经记为1,所以用前缀和出现最多的值即可表示划分出零区间的个数
}
cout << results;
return 0;
}