思路 : 可以 推知 挡板的位置与最后 一步的方向有关 。如果是 R 根据题目要求那么最终结果一定是在>0的位置,
因为按照题意要求的最终不能回到重复走过的位置。所以如果有解的话挡板只能放在 < 0 的位置,分析一下就是 放在 >0的位置有
两种情况 1 .在最终结果前面 ,这显然不可以 会直接导致走不过去,2.放在最终结果后面, 这似乎是个无用操作,,
所以 只能是 在<0的位置,而且有一个性质,那放在 <0的情况来说 就是 如果 x位置是正确的那么 x +1 的位置也正确,当然 ( x + 1 ) < 0.
感性理解一下 , 放挡板是为了 让最终能够到达一个新的地方 , 挡板的作用就是 阻止一些向与最终方向相反的行动。分析完这些之后
发现可以二分答案 找一个最左的 放挡板的位置 即可。
#include<bits/stdc++.h> using namespace std; #define maxn 1234567 char str[maxn]; int n,l,r,ans; bool ok(int x) { int now=0,ml=0,mr=0; for(int i=0; i<n; i++) { if(str[i]=='R') { now++; if(now==x)now--; } else { now--; if(now==x)now++; } if(i<n-1) { ml=min(now,ml); mr=max(now,mr); } } if(str[n-1]=='R'&&now>mr)return true; if(str[n-1]=='L'&&now<ml)return true; return false; } int main() { scanf("%d",&n); scanf("%s",str); if(str[n-1]=='R') { r=n; while(l-1<r) { int mid=(r+l)/2; if(ok(mid)) r=mid-1; else l=mid+1; } if(l>=0) printf("-1\n"); else if(l==-n)printf("0 1\n"); else printf("1 %d\n",-l); } else { r=n; while(l-1<r) { int mid=(r+l)/2; if(ok(mid)) l=mid+1; else r=mid-1; } if(r<=0) printf("-1\n"); else if(r==n)printf("0 1\n"); else printf("1 %d\n",r); } return 0; }