AT_joi2021_yo1b_b 题解

小蒟蒻的第二篇题解,有问题请指出。

思路 1

用三重循环从字符串 \(s\) 里依次找出 IOI

第一个循环找第一个 I,若找出,继续第二个循环找 O,若找出,最后第三个循环找 I,若全部找出,直接输出 Yes 返回 \(0\) 结束。遍历整个字符串也没有 IOI 的话,便输出 No。要注意的是,并不是连续的 IOI,只要有出现 IOI 并且顺序一样,就是正确的。

代码 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;
}
posted @ 2023-06-21 06:45  volatiles  阅读(54)  评论(0)    收藏  举报