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;
}