太弱了。。还是笨。。
这题脑洞题,说一下贪心思路。
首先我们注意到 如果连续一段和为0,其他部分耿直的转移,那么就能少移动一次(中间不考虑子段,只让这一段变成了0),
如果 这一段后面还有连续的一段和为0 ,那么就能少移动两次。。
以此类推。。。
例如 xxxxxxxxxxx1 2 -2 -1 1 -1xxxxxxxx
如果中间那些耿直的移动一定是要移动6次才能都是0的,如果分成两段的话,明显只要4次。。
ps。为什么断开不行?因为断开中间的那些是要跨过两段的0 的,这样和中间断开至少有一个,那么好不容易节约下来的又要被移动中间那个花费掉了(甚至更多)。
所以就有了贪心策略,找到最多的连续0的方法。。这里就要考虑维护前缀和了。。
PPS。是个环你没有考虑呀?
其实不然,当我们取出最长的若干段的时候,剩下的一定是和为 0 。那么就很愉快了,答案就是 N - ANS 了。。
写这么多可能还是没讲清楚,请大家见谅,确实自己理解也不深刻,蒟蒻加油吧~
#include <bits/stdc++.h>
using namespace std;
map<long long,long long> mp;
int main(){
int n ,x ;
long long ans=0;
long long sum=0;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&x);
sum+=x;
ans=max(ans,++mp[sum]);
}
cout<<n-ans<<endl;
return 0;
}