訓練情況
賽後反思
簡單題A題做紅溫了,怒吃 6 罰時,C題雙指標其實差不多想出來了,但是對於判斷字串合法其實可以只判斷兩個端點,不需要全部遍歷,中途還想了二分做法(?),然而寫到最後發現並沒有二分單調性。
A題
記得判斷字串的長度必須是奇數,\(1 \sim \frac{n+1}{2}-1\) 是 1
,\(\frac{n+1}/2\) 是 /
,\(\frac{n+1}{2}+1 \sim n\) 是 2
。滿足上述所有條件就輸出 Yes
,否則輸出 No
。
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
void solve(){
int n;
char s[107];
cin>>n;
getchar();
for(int i = 1;i<=n;i++) cin>>s[i];
bool flag = true;
if(n%2==0) flag = false;
for(int i = 1;i<=(n+1)/2-1;i++) if(s[i] != '1') flag = false;
if(s[(n+1)/2] != '/') flag = false;
for(int i = (n+1)/2+1;i<=n;i++) if(s[i] != '2') flag = false;
if(flag) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
signed main(){
// int T; cin>>T; while(T--)
solve();
return 0;
}
B題
判斷 \(2i - 1\) 和 \(2i\) 上的字元是否相同,字串中每一個字母出現的次數均為 \(2\),滿足上述所有條件輸出 Yes
,否則輸出 No
。
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
void solve(){
char s[107]; cin>>s+1;
int n = strlen(s+1);
bool flag = true;
if(n&1) flag = false;
for(int i = 1;i<=n/2;i++) if(s[2*i-1] != s[2*i]) flag = false;
map<char,int> cnt;
for(int i = 1;i<=n;i++) cnt[s[i]]++;
for(auto i:cnt) if(i.second != 2) flag = false;
if(flag) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
signed main(){
// int T; cin>>T; while(T--)
solve();
return 0;
}
C題
判斷字串中的滿足 11/22
序列最長的子串長度,我們發現序列必須 /
在中間,所以我們考慮列舉 /
的位置再使用雙指標往兩邊找,左邊必須是 1
,右邊必須是 2
,滿足條件就 l--,r++ 擴大範圍,最後答案取子串長度 \(r-l+1\) 的最大值。
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
void solve(){
int n; string s;
cin>>n>>s;
int ans = 0;
for(int i = 0;i<n;i++){
if(s[i] != '/') continue;
int l = i;
int r = i;
while(l-1>=0&&r-1<=n-1&&s[l-1] == '1'&&s[r+1]=='2'){
l--,r++;
}
ans = max(ans,r-l+1);
}
cout<<ans<<endl;
}
signed main(){
// int T; cin>>T; while(T--)
solve();
return 0;
}