牛客练习赛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