AT_joi2021_yo1b_b 题解
小蒟蒻的第二篇题解,有问题请指出。
思路 1
用三重循环从字符串 \(s\) 里依次找出 I、O、I。
第一个循环找第一个 I,若找出,继续第二个循环找 O,若找出,最后第三个循环找 I,若全部找出,直接输出 Yes 返回 \(0\) 结束。遍历整个字符串也没有 I、O、I 的话,便输出 No。要注意的是,并不是连续的 IOI,只要有出现 I、O、I 并且顺序一样,就是正确的。
代码 1
#include<iostream>
#include<string>
using namespace std;
int main()
{
int n;
string a;
cin >> n >> a;
for (int i = 0; i < n; i++) {
if (a[i] == 'I') {
for (int j = i + 1; j < n; j++) {
if (a[j] == 'O') {
for (int k = j + 1; k < n; k++) {
if (a[k] == 'I') {
cout << "Yes\n";
return 0;
}
}
}
}
}
}
cout << "No\n";
return 0;
}
我不会告诉你我大小写输错导致四次提交错误
思路 2
但是这就结束了吗?这么做也太不符合 oier 的良好品质了,还有一种 \(O(n)\) 做法(感谢@zym0325的提醒),定义一个计数器 \(sum\),遍历一下 \(s\),如果为 I 并且 \(sum\) 为 \(0\) 或 \(2\),那么 \(sum\) 自加 \(1\)。如果为 O 并且 \(sum\) 为 \(1\),那么 \(sum\) 自加 \(1\)。循环结束后判断 \(sum\) 是否为 \(3\),如果是,输出 Yes,否则输出 No。
代码 2
#include<iostream>
#include<string>
using namespace std;
int main()
{
int n,sum=0;
string s;
cin>>n>>s;
for(int i=0;i<n;i++){
if(s[i]=='I'&&(sum==0||sum==2)) sum++;
if(s[i]=='O'&&sum==1) sum++;
}
if(sum==3) cout<<"Yes\n";
else cout<<"No\n";
return 0;
}

浙公网安备 33010602011771号