列表

详情


NC21730. Rabbit的机器人

描述

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

输入描述

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

输出描述

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

示例1

输入:

3
LLR

输出:

1 1

说明:

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

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++11(clang++ 3.9) 解法, 执行用时: 60ms, 内存消耗: 2552K, 提交时间: 2019-01-08 20:58:57

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
const int maxn = 1000005;
const ll INF = 1e18;
const ll mod=1e9+7;
const double eps = 1e-7;

char s[maxn];
char tmp;
int len;

int check(int x) {
	int pos=0;
	int Max=0;
	for(int i=0; i<len; i++) {
		Max=max(Max,pos);
		if(s[i]==tmp) pos++;
		else pos--;
		if(pos==-x) pos++;
	}
	return pos>Max;
}

int main() {
	int len1;
	scanf("%d",&len1);
	scanf("%s",s);
	len=strlen(s);
	tmp=s[len-1];
	int l=1,r=len;
	int ans=-1;
	while(l<=r) {
		int mid=(l+r)/2;
		if(check(mid)) {
			ans=mid;
			l=mid+1;
		} else r=mid-1;
	}
	if(ans==-1) puts("-1");
	else if(ans==len) puts("0 1");
	else printf("1 %d\n",ans);
}

C++14(g++5.4) 解法, 执行用时: 36ms, 内存消耗: 1368K, 提交时间: 2020-08-06 12:05:01

#include<bits/stdc++.h>
using namespace std;

int n,l,r,mid,ans=-1;
char R[1000005];
bool judge(int x)
{
	int i,j=0,k=0;
	for(i=0;i<n;i++)
	{
		k=max(k,j);
		if(R[i]==R[n-1])j++;
		else j--;
		if(j==-x)j++;
	}
	return j>k;
}
int main()
{
    scanf("%d%s",&n,R);
    for(l=1,r=n;l<=r;)
    {
    	mid=(l+r)>>1;
    	if(judge(mid))ans=mid,l=mid+1;
    	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;
}

上一题