CF405B 题解

Jerrlee✅

2022-02-20 14:07:34

Solution

## 题意 给你一些多米诺骨牌,现在将他们向左或向右推,并且保证,**在每两个多米诺骨牌推向相同方向之间的某个地方,至少有一个多米诺骨牌被推向相反的方向**。 可以看此图理解样例一: ![](https://cdn.luogu.org/upload/vjudge_pic/CF405B/37fecb2c12dba94b96d336756a84bf7894c6655a.png) 橙色的是站着的(共 $4$ 个)。 ## 思路 有三种情况可能会让骨牌站着: 1. 最左边有骨牌且没别的骨牌推它; 2. 最右边有骨牌且没别的骨牌推它; 3. 向右的力和向左的力间有奇数个骨牌。 注意一下,`L` 和 `R` 也是骨牌,一样会倒。 按照上面的思路,可以写出如下代码: ```cpp #include<iostream> using namespace std; int cnt,n,ans,flag; string s; int main(){ cin>>n>>s; for(int i=0;i<n;i++){ if(flag){ if(s[i]=='.') cnt++; else{ ans+=(cnt%2); cnt=0,flag--; } } else{ if(s[i]=='.') cnt++; else{ if(s[i]!='L') ans+=cnt,flag++; cnt=0; } } } cout<<ans; } ``` 然后就会发现样例 $2$ 都没过。 这时候就提醒了我们要特判,$flag$ 依旧为 $0$ 就说明向左或向右的力没有另一股力阻挡它。 加上如下代码:`if(!flag) ans+=cnt;` 即可 AC! [AC 记录(洛谷)](https://www.luogu.com.cn/record/69721836) [AC 记录(CF)](https://codeforces.com/contest/405/submission/146987365)