P9503 题解

一道简单的模拟题尽管我花了好久才写出来

思路分析

我们可以知道,如果想让背景为某个颜色,那么颜色前面的所有幕布都需要被拉起来,而这个颜色的幕布则需要被放下。

所以我们对于每次操作,只需检查一遍它前面的幕布和这块幕布的状况即可。

程序实现

#include <bits/stdc++.h>
using namespace std;
int a[3];
// a数组记录幕布的状态,1表示没拉上,0表示拉上了
// a[0]代表白色,a[1]代表蓝色,a[2]代表红色
int main() {
	int n, ans = 0; // 非全局变量一定要清零!
	string str;
	cin >> n >> str;
	a[0] = a[1] = a[2] = 1; // 初始化状态为全部没拉上
	for (auto ch : str) {
		switch (ch) {
		case 'B':
			ans += a[1] == 0; // 是否拉上了
			// 因为==优先级比+=高,所以可以这样写
			ans += a[0] == 1; // 是否没拉上
			a[0] = 0, a[1] = 1; // 修改状态
			// 其他的大同小异,以此类推即可
			break;
		case 'R':
			ans += a[2] == 0;
			ans += a[1] == 1;
			ans += a[0] == 1;
			a[0] = a[1] = 0, a[2] = 1;
			break;
		case 'W':
			ans += a[0] == 0;
			a[0] = 1;
			break;
		}
	}
	cout << ans;
	return 0;
}
posted @ 2023-09-10 14:09  群星之路  阅读(9)  评论(0)    收藏  举报