题目描述
将 n 块多米诺骨牌排成一排,每块骨牌垂直竖立。
开始时,同时将一些骨牌推倒,有的向右倒,有的向左倒。
保证这些开始就被推倒的骨牌中,任意两块倒向同一方向的骨牌之间都至少存在一块倒向反方向的骨牌。
每一秒后,每个向左倒的骨牌都会推倒其左侧相邻的骨牌,每个向右倒的骨牌都会推倒其右侧相邻的骨牌。
如果在某一时刻,某骨牌两侧的相邻骨牌同时倒向它,则由于力的平衡,该骨牌会保持垂直竖立不变。
下图给出了此过程的一个可能示例。
给定每块骨牌的初始状态,请你判断在推倒过程完全结束后,有多少块骨牌仍然保持垂直竖立。
输入格式
第一行包含整数 n。
第二行包含一个长度为 n 的字符串,其中的第 i 个字符表示第 i 个骨牌的初始状态:
-
L
表示该骨牌开始时向左倒。 -
R
表示该骨牌开始时向右倒。 -
.
表示该骨牌开始时不倒。
保证,对于 (i,j): -
如果 i<j 且 si 和 sj 均为
L
,则一定存在 k 满足 i<k<j 且 sk 为R
。 -
如果 i<j 且 si 和 sj 均为
R
,则一定存在k
满足 i<k<j 且 sk 为L
。
输出格式
一个整数,表示最终保持垂直竖立的骨牌数量。
数据范围
前 6 个测试点满足 1≤n≤15。
所有测试点满足 1≤n≤3000。
输入样例1:
14
.L.R...LR..L..
输出样例1:
4
输入样例2:
5
R....
输出样例2:
0
输入样例3:
1
.
输出样例3:
1
题意
- 题意:多米诺骨牌放置顺序为 R L R …
- 即:不会连续出现R,或者L
题解:
- 代码解释
变量l
,从头开始找直至不是.
变量r
,从尾开始找直至不是.
最后在l
到r
的范围查询,如果是.
,cnt++
,如果到L
了,则 res +cnt%2
,否则从l
到r
全部为.
,res +cnt
注意:res在加过cnt后要初始cnt的值,以进行下次判断
代码
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
int n;
string str;
cin >> n >> str;
int l = 0;
while(l < n && str[l] == '.') l++;
int res = 0;
if(l == n) res = n;
else
{
if(str[l] == 'R') res = l;
int r = n - 1;
while(str[r] == '.') r--;
if(str[r] == 'L') res += n - r - 1;
for(int i = l + 1,cnt = 0;i <= r;i++)
{
if(str[i] == '.') cnt++;
else
{
if(str[i] == 'L') res += cnt%2;
else res += cnt;
cnt = 0;
}
}
}
cout << res << endl;
return 0;
}