4 条题解
-
6
萌新专用简易版题解: (已AC)
#include <bits/stdc++.h> using namespace std; string x; int a[100001],f[100001],g[100001],n,ans; int main() { cin >> n >> x; for(int i = 1;i <= n;i++){ a[i] = x[i-1]-'0'; } for(int i = 1;i <= n;i++){ if(a[i] == 1){ f[i] = f[i-1]+1; } else{ f[i] = 0; } } for (int i = n;i >= 1;i--) { if(a[i] == 1){ g[i] = g[i+1]+1; } else g[i] = 0; } for(int i = 1;i <= n;i++){ if(a[i] == 0){ ans = max(ans,f[i-1]+g[i+1]+1); } } cout << ans; return 0; }
一个赞抱走~
-
1
@ hetao24883491 无“防作弊”版: 👍 👍 👍
#include <iostream> #include <cstring> using namespace std; int main(void) { register int n,*f,*g,ans=0; string str; cin>>n>>str; f=new int[n+2]; g=new int[n+2]; memset(f,0,(n+2)*sizeof(int)); memset(g,0,(n+2)*sizeof(int)); for(register int i=1;i<=n;i++) if(str[i-1]=='1') f[i]=f[i-1]+1; for(register int i=n;i>=1;i--) if(str[i-1]=='1') g[i]=g[i+1]+1; for(int i=1;i<=n;i++) if(str[i-1]=='0') ans=max(ans,f[i-1]+g[i+1]+1); cout<<ans; delete f; delete g; return 0; }
-
-1
#include <iostream> #include <iomanip> #include <stdio.h> #include <bits/stdc++.h> #include <algorithm> #include <cmath> #include <string> using namespace std; int main(void) { register int n,*f,*g,ans=0; string str; cin>>n>>str; f=new int[n+2]; g=new int[n+2]; memset(f,0,(n+2)*sizeof(int)); memset(g,0,(n+2)*sizeof(int)); for(register int i=1;i<=n;i++) if(str[i-1]=='1') f[i]=f[i-1]+1; for(register int i=n;i>=1;i--) if(str[i-1]=='1') g[i]=g[i+1]+1; for(int i=1;i<=n;i++) if(str[i-1]=='0') ans=max(ans,f[i-1]+g[i+1]+1); cout<<ans; delete f; delete g; return 0; }
-
-2
定义f数组和g数组,分别统计正向第i个最长'1'的长度和逆向第i个最长'1'的长度,然后找到str[i]是'0'的位置进行统计。
把0转成1至少不会减少最长长度,而把1转成0绝对不会增加长度。
公式:
ans=max(ans,f[i-1]+g[i+1]+1)
#include <iostream> \\防作弊 #include <cstring> \\防作弊 using namespace std; \\防作弊 int main(void){ \\防作弊 register int n,*f,*g,ans=0; \\防作弊 string str; \\防作弊 cin>>n>>str; \\防作弊 f=new int[n+2]; \\防作弊 g=new int[n+2]; \\防作弊 memset(f,0,(n+2)*sizeof(int)); \\防作弊 memset(g,0,(n+2)*sizeof(int)); \\防作弊 for(register int i=1;i<=n;i++) \\防作弊 if(str[i-1]=='1') \\防作弊 f[i]=f[i-1]+1; \\防作弊 for(register int i=n;i>=1;i--) \\防作弊 if(str[i-1]=='1') \\防作弊 g[i]=g[i+1]+1; \\防作弊 for(int i=1;i<=n;i++) \\防作弊 if(str[i-1]=='0') \\防作弊 ans=max(ans,f[i-1]+g[i+1]+1); \\防作弊 cout<<ans; \\防作弊 delete f; \\防作弊 delete g; \\防作弊 return 0; \\防作弊 } //防作弊
- 1
信息
- ID
- 502
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- (无)
- 递交数
- 290
- 已通过
- 161
- 上传者