还钱
整体思路:前缀和优化
首先不难发现,我们只要遇到一段和为零的银行,就进行操作。这样肯定是最有的。
对于每一段来说,如果长度是\(l\),那么答案就要增加\(l-1\)
所以,分的段数越多,答案就越优(因为可以减掉更多的1)。
最朴素的思想就是去枚举所有位置,然后看能分出多少短,时间复杂度是O(Tn²)。这个太高了,通过不了。
我们可以用前缀和优化。其中一段的和就是前缀和中一段的差。如果这一段的和为零,那么对应在前缀和数组里面就是两个相同的数字。然后我们用一个map来记录数字个数,然后实时更新可以分出来最多多少段。
答案就是n-ans
结束了?
代码如下
#include<bits/stdc++.h>
using namespace std;
int n;
map<long long,int> mp;
void solve(){
mp.clear();
int ans=0;long long sum=0;
cin>>n;for(int i=1;i<=n;i++){
int x;cin>>x;
sum+=x;
ans=max(ans,++mp[sum]);
}
!sum?cout<<n-ans<<endl:cout<<"laycentral"<<endl;
}
int main(){
freopen("retmoy.in","r",stdin);
freopen("retmoy.out","w",stdout);
int t;cin>>t;
while(t--) solve();
}
byebye

浙公网安备 33010602011771号