其他分享
首页 > 其他分享> > 牛客练习赛36 E.Rabbit的机器人(思维+隐藏单调性二分)

牛客练习赛36 E.Rabbit的机器人(思维+隐藏单调性二分)

作者:互联网

传送门

首先注意到如果最后一个字符是 L L L,说明终止位置一定在左边

首先注意到如果最后一个字符是 R R R,说明终止位置一定在右边

拿终止位置在左边来说

那么左边不可能放障碍物,因为会挡到去路

如果在右边放障碍物最多放一个,因为只有最近的有用

问题变成:在右边放一个障碍物有几种放法??

其实如果在 x x x位置放障碍物可行,那么在 x − 1 x-1 x−1放障碍物也是可以的

因为一定能向左边走的更得更远

#include <bits/stdc++.h>
using namespace std;
const int inf = 1e9;
const int maxn = 1e6+10;
char a[maxn];
int n,ans=inf,vis[maxn];
map<int,int>mp;
int isok(int mid)
{
	int x = 0,now = 0,k = 1;
	for(int i=1;i<=n;i++)
	{
		if( a[i]=='L'&&x-1!=mid )	x--;	
		if( a[i]=='R'&&x+1!=mid )	x++;
	} 
	for(int i=1;i<=n;i++)
	{
		if( now==x )	k--;
		if( a[i]=='L'&&now-1!=mid )	now--;	
		if( a[i]=='R'&&now+1!=mid )	now++;
	} 
	if( now==x )	k--;
	return k>=0;
}
int main()
{
    cin >> n >> (a+1);
    if( a[n]=='L' )//终点在左边 
    {
    	//障碍物可以放在右边 
    	int l = 1,r = n;
    	while( r>=l )
    	{
    		int mid = l+r>>1;
    		if( isok(mid) )	l = mid+1,ans = mid;
			else	r = mid-1;	
		}
	}
	else//终点在右边 
	{
		//障碍物可以放在左边 
		int l = -n,r = -1;
		while( r>=l )
		{
			int mid = (l+r)/2;
			if( isok(mid) )	r = mid-1,ans = mid;
			else	l = mid+1;	
		}
	}
	if( isok(inf) ){	cout << 0 << " " << 1; return 0; }
	if( ans==inf )	{ cout << -1; return 0; }
	cout << 1 << " " << abs(ans);
}

标签:障碍物,练习赛,int,isok,36,mid,牛客,&&,now
来源: https://blog.csdn.net/jziwjxjd/article/details/111657634