牛客网练习赛36 E Rabbit的机器人 思维+二分

转载自牛客网题解:

链接:https://ac.nowcoder.com/acm/contest/328/E
来源:牛客网
 

题目描述

xxx给Rabbit买了一个机器人,机器人只能在一个直轨道上行走,直轨道由无限多个方格组成,且每个方格按顺序编号,‘0’号方格右侧编号为正,‘0’号方格左侧编号为负。Rabbit可以给机器人一系列‘LR’指令,‘L’和‘R’分别代表让机器人向左走一个方格和向右走一个方格。
而且Rabbit还可以在某些方格上预先放置障碍(不能放在‘0’号方格),如果机器人执行某一个指令后会到达放置有障碍的方格,则这个指令无效。(不影响后续指令的执行)
现在Rabbit已经给机器人设置了一系列指令,为了让机器人执行最后一个指令后到达一个从来没有到过的方格,她想知道自己至少要放置多少个障碍,且在放置个数最小的情况下的方案数。

输入描述:

第一行一个整数N,表示指令长度。
接下来一行一个长度为N的字符串,代表Rabbit设置的指令。

输出描述:

如果有解,输出两个整数表示Rabbit最少放置障碍的个数以及在放置个数最小的情况下的方案数,用空格隔开。
否则输出“-1”。

示例1

输入

复制

3
LLR

输出

复制

1 1

说明

可以在-1这个位置放置障碍物,只执行向右走的操作。

备注:

1<=N<=1e6

 

首先我们可以知道,在0的两侧只能选择一侧放置一个障碍物即可,否则会出现,机器人在两个障碍物之间来回走的情况。

因此对于障碍物,我们最多放置一个即可。

同时对于最后一个指令是'L/R',我们的障碍物就要分别放在右边或者左边,这样才能保证机器人最后的位置是没有走过的位置。那么以右边为例,机器人最后指令是右,那么我们在左边放置障碍物,如果对于一个x1<x2,即x1在x2的左边,那么如果x1能够让机器人最终到达机器人没有到达过得位置,那么x2一定也可以,因此对于x1,x2遵循单调规律, 那么对于可放置的方案,就可以二分查找最左端可以防止障碍物的位置即可。如果,可放置的位置最终等于指令长度,说明不需要放置障碍物也得让机器人到达最终位置。

#include <cstdio>
#include <bits/stdc++.h>
#include <map>
#include <cstring>
#include <algorithm>
#include <string>
using namespace std;

typedef long long ll;

string s;
char tmp;
int n;

int judge(int x)
{
    int Maxn=0,p=0;
    for(int i=0;i<n;i++)
    {
        Maxn=max(Maxn,p);
        if(s[i]==tmp)
        {
            p++;
        }
        else
            p--;
        if(p==-x)
            p++;
    }
    return p>Maxn;
}

int main()
{
    cin>>n;
    cin>>s;
    //len=strlen(s);
    tmp=s[n-1];
    int l=1,r=n,ans=-1;
    while(r>=l)
    {
        int mid=(l+r)/2;
        if(judge(mid))
        {
            l=mid+1;
            ans=mid;
        }
        else
            r=mid-1;
    }
    if(ans==-1)
        printf("-1\n");
    else if(ans==n)
        printf("0 1\n");
    else
    {
        printf("1 %d\n",ans);
    }
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值