还钱

题目传送门

整体思路:前缀和优化

首先不难发现,我们只要遇到一段和为零的银行,就进行操作。这样肯定是最有的。
对于每一段来说,如果长度是\(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

posted @ 2026-01-24 11:45  zhangruotian_Max  阅读(1)  评论(0)    收藏  举报