题目背景
照片留下了值得留恋的瞬间,但对于魔法士来说最重要的是向前看。——殿堂魔法士 W
题目描述
小 M 正在准备入学所必需的魔法士证件,因此他来到了纵深巷的魔法照相馆。
在等待的时候,小 M 注意到魔法照相馆有三个幕布,颜色从左到右分别是红色、蓝色和白色。店主 zx 先生会根据客人的需求拉上或拉下这三个幕布,如下图所示:
幕布摆放在左边,按照红蓝白的顺序排列。人则坐在幕布右边,而 zx 先生则站在最右边给人拍照。幕布从右往左数,第一个没有拉上的幕布颜色将成为照片的背景颜色。
每次 zx 先生拉上或拉下一个幕布都需要消耗一个时间单位,而拍照不消耗时间。小 M 已经知道了他前面所有总共 n n n 个客人的需求。在初始状态为 全部拉下 的情况下,请你帮助小 M 计算他至少需要等待多少个时间单位。
输入格式
第一行一个整数 n n n。
第二行一个由 RBW
三个大写字母组成的长度为 n n n 的字符串,其中第 i i i 个字符表示第 i i i 个客人的需求,R
是红色,B
是蓝色,W
是白色。
输出格式
一行一个整数,表示小 M 至少需要等待的时间单位。
样例 #1
样例输入 #1
5
BBRWB
样例输出 #1
5
提示
【样例 1 解释】
开始三个幕布是全部拉下的。
- 第一位客人要求蓝色,所以拉上白色,消耗一个时间单位。
- 第二位客人要求蓝色,无需改动。
- 第三位客人要求红色,所以在之前基础上拉上蓝色,消耗一个时间单位。
- 第四位客人要求白色,所以拉下白色,消耗一个时间单位。
- 第五位客人要求蓝色,所以拉上白色,拉下蓝色,消耗两个时间单位。
共计消耗五个时间单位。
1.题目分析
概括下题意:第一行输入一个整数代表客人的个数,第二行输入字符串代表每一个客人的需求,白, 蓝,红,三者有顺序层级的关系,初始状态全部拉下,要考虑每一次操作之后对顺序的影响,所以每一操作耗时可能不一样,求所有客人操作之后消耗的总时长。
2.题目思路
设置一个长度为3的整型数组,代表幕布的状态,索引数:0 表示红,1 表示 蓝色,2表示白色。
索引对应的值:1代表拉下,为0代表拉上。所以将三个元素初始化为1。
定义一个足够长的字符数组,用于存储用户的操作数。
写一个for循环代表每一个用户输入的需求,嵌套一个switch,分别对需求为白,蓝,红进行分类讨论即可。比较简单,这里就不过多展开了,大家可以自行查看代码。
最后循环结束打印时长即可。
3.代码演示
#include <stdio.h>int main() {//0 表示红,1 表示 蓝色,2表示白色,数值为1代表拉下,为0代表拉上int arr[3] = {1, 1, 1};int n;int t = 0;scanf("%d", &n);char ch[100000];scanf("%s", ch);for (int i = 0; i < n; ++i) {switch (ch[i]) {case 'W':if (arr[2] == 0) {arr[2] = 1;t++;}break;case 'B':if (arr[2] == 0) {//白色拉上if (arr[1] == 0) {arr[1] = 1;t++;}} else {arr[2] = 0;t++;if (arr[1] == 0) {arr[1] = 1;t++;}}break;case 'R'://白色的情况if (arr[2] == 0) {//蓝色if (arr[1] == 0) {//红色if (arr[0] == 0) {arr[0] = 1;t++;}} else {arr[1] = 0;t++;//红色if (arr[0] == 0) {arr[0] = 1;t++;}}} else {arr[2] = 0;t++;//蓝色if (arr[1] == 0) {//红色if (arr[0] == 0) {arr[0] = 1;t++;}} else {arr[1] = 0;t++;//红色if (arr[0] == 0) {arr[0] = 1;t++;}}}break;default:break;}}//打印消耗的总时长printf("%d", t);return 0;
}