60分求助

P1114 “非常男女”计划

用二分不太对应为可能有区间mid两边都有 建议用前缀和 给你看下我的AC code ``` #include<bits/stdc++.h> using namespace std; int n,b[100010],g[100010],ans; bool a[100010]; int main() { cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=n;i++) if(a[i]==1) b[i]=b[i-1]+1; else b[i]=b[i-1]; for(int i=1;i<=n;i++) if(a[i]==0) g[i]=g[i-1]+1; else g[i]=g[i-1]; for(int i=0;i<=n;i++) { for(int j=i+ans;j<=n;j++) if(b[j]-b[i]==g[j]-g[i]) ans=max(ans,j-i); } cout<<ans<<endl; return 0; } ``` 求关
by 玉树临风英俊潇洒 @ 2024-09-16 14:36:43


没必要这么麻烦吧,可以用前缀和二维暴力,长度要尽量长,从长到短暴力枚举遇到的第一个绝对是最长的,输出就可以了 然后就是由于男女需要配对,最多配对2*min(男生数量,女生数量),所以一开始可以不比从N开始 对于玩法配对的情况,只存在于其中一方为0的情况,特判就可以了 ```c #include<bits/stdc++.h> using namespace std; int a[100005][2]; int main(){ int n; cin>>n; for(int i=1;i<=n;i++){ int x; cin>>x; a[i][x]++; a[i][0]+=a[i-1][0]; a[i][1]+=a[i-1][1]; } if(a[n][0]==0||a[n][1]==0){ cout<<0; return 0; } for(int k=min(a[n][0],a[n][1])*2;k>1;k--){ for(int i=1;i<=n-k+1;i++){ if(a[i+k-1][0]-a[i-1][0]==a[i+k-1][1]-a[i-1][1]){ cout<<k; return 0; } } } return 0; } ```
by imagine_innovate @ 2024-09-16 20:51:35


|