转载自牛客网题解:
链接: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;
}