地址:http://codeforces.com/contest/405/problem/B
题意:就是模拟多米诺骨牌的变形,看图即可明白题意,难点是处理中间.L.…….R. 和.R.…….L.的情况,我的思路是先统计L R个数和位置(针对只有一个L 、一个 R或者一个都没有的特判) 然后针对每个字符,记录L、R的位置 分.L.…….R. 和 .R.…….L.两种进行讨论、计算即可,具体实现看代码
代码如下:
#include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> using namespace std; char s[3020]; int i,n,l=0,r=0,cl,cr,ll,lr,ans=0; int main() { cin >>n; for(i=1;i<=n;i++) { cin >>s[i]; if(s[i]=='L')ll=i,cl++; if(s[i]=='R')lr=i,cr++; } bool f=true; if(cr==1&&cl==0) { cout <<lr-1<<endl;f=false; } if(cr==0&&cl==0) { cout <<n<<endl;f=false; } if(cl==1&&cr==0) { cout <<n-ll<<endl;f=false; } if(f) { int i=0; while(i<n) { i++; if(s[i]!='.') { if(s[i]=='L')l=i; if(s[i]=='R')r=i; if(l!=0&&r!=0) { if(l>r)ans+=(l-r-1)%2; if(r>l)ans+=r-l-1; } } } for(i=1;i<=n;i++) { if(s[i]=='L')break; if(s[i]=='R') { ans+=i-1;break; } } for(i=n;i>0;i--) { if(s[i]=='R')break; if(s[i]=='L') { ans+=n-i;break; } } cout <<ans<<endl; } return 0; }