题意:
给你一堆多米勒骨牌,.表示不动,L表示向左倒,R表示向右倒。问最后没有倒的多米勒骨牌有几个。
思路:
模拟。对于一个L方向的骨牌,将其左边不动的骨牌标记为倒。对于一个R方向的骨牌,从它右边第一个骨牌开始一直枚举到一个方向为L的骨牌,若没有直接枚举完,记录它们直接的骨牌个数。若个数为奇数,则中间那个骨牌不会倒,ans+=1。
#include<cstdio>
#include<cstring>
const int MAX=3005;
int n;
char s[MAX];
bool use[MAX];
int main(){
scanf("%d",&n);
scanf("%s",s+1);
int ans=0;
memset(use,false,sizeof(use));
for(int i=1;i<=n;i++){
if(s[i]=='L'){
for(int j=i-1;j>=1;j--){
use[j]=true;
if(s[j]!='.') break;
}
}
if(s[i]=='R'){
int num=0,j;
for(j=i+1;j<=n;j++){
use[j]=true;
if(s[j]!='L') num++;
else break;
}
if(s[j]=='L') ans+=(num%2==1);
i=j;
}
}
for(int i=1;i<=n;i++){
if(use[i]==false&&s[i]=='.') ans++;
}
printf("%d\n",ans);
return 0;
}