NC16261. 合唱队形
描述
输入描述
第一行一个数字n表示铁子班级的总人数。1≤n≤105
第二行一个字符串s表示最初的队形布置,si=0表示第i个人是女生,si=1表示第i个人是男生。
输出描述
输出一行表示答案
示例1
输入:
6 101010
输出:
3
说明:
将第6个女生和第3个男生交换位置可以满足要求C++14(g++5.4) 解法, 执行用时: 8ms, 内存消耗: 848K, 提交时间: 2020-04-06 15:51:33
#include<bits/stdc++.h> using namespace std; char ch[100005]; int f[100005]; int main(void) { int n; cin>>n; cin>>ch; int k=0,sum=0; for(int i=0;i<n;i++){ if(ch[i]=='0'){sum++;f[k]++;} else k++; } int ans=0; for(int i=1;i<=k;i++) ans=max(ans,f[i]+f[i-1]); if(sum==n||sum==ans)cout<<sum; else cout<<ans+1; }
C++11(clang++ 3.9) 解法, 执行用时: 7ms, 内存消耗: 1000K, 提交时间: 2020-02-28 21:42:50
#include<bits/stdc++.h> using namespace std; int main() { int i,j,t=0,n,S[100005]={0}; char R[100005]; scanf("%d%s",&n,R+1); for(i=1;i<=n;i++) S[i]=S[i-1]+(R[i]-'0'?0:1); for(i=j=1;i<=j&&j<=n;) { if(j-i<S[n]&&j-i-S[j]+S[i-1]<1) { if(t<j-i+1) t=j-i+1; j++; } else i++; } printf("%d\n",t); return 0; }