Infiniti

   :: 首页  :: 新随笔  ::  ::  :: 管理

Rabbit的机器人

思路 : 可以 推知 挡板的位置与最后 一步的方向有关 。如果是 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;
}

  

 

posted on 2019-01-11 16:27  自由缚  阅读(259)  评论(0编辑  收藏  举报