ACWing 4217. 机器人移动
在一个无限大的二维平面上有一个机器人。
初始时,机器人位于点
机器人可以执行四种行动指令:
U
— 从( x , y ) ">(x,y)(x,y) 移动到( x , y + 1 ) ">(x,y+1)(x,y+1);D
— 从( x , y ) ">(x,y)(x,y) 移动到( x , y − 1 ) ">(x,y?1)(x,y?1);L
— 从( x , y ) ">(x,y)(x,y) 移动到( x − 1 , y ) ">(x?1,y)(x?1,y);R
— 从( x , y ) ">(x,y)(x,y) 移动到( x + 1 , y ) ">(x+1,y)(x+1,y)。
给定一个长度为
我们希望机器人最终抵达目标地点
为了达成这一目的,我们可能需要对指令序列进行修改。
每次修改可以选择其中一个指令,并将其替换为四种指令之一。
注意,只能对序列中的指令进行替换,不得随意删除指令或添加额外指令。
不妨设经过修改的指令中,编号最小的指令编号为
我们定义修改成本为
例如,将 RRRRRRR
修改为 RLRRLRL
,则编号为
请你计算,为了使得机器人能够最终抵达目标点
如果不需要对序列进行修改,则成本为
输入格式
第一行包含整数
第二行包含一个长度为 U
,D
,L
,R
。
第三行包含两个整数
输出格式
输出一个整数,表示最小修改成本。
如果无论如何修改,机器人都无法抵达目标位置,则输出
数据范围
前四个测试点满足
所有测试点满足
输入样例1:
5
RURUU
-2 3
输出样例1:
3
输入样例2:
4
RULR
1 1
输出样例2:
0
输入样例3:
3
UUU
100 100
输出样例3:
-1
1 二分答案o(nlogn) 2 枚举所有mid区间,前缀和记录除去mid区间的影响使得机器人到达,xi,yi; 3 等价判断xi,yi能否改至多mid次操作到达sx,sy; 4 不难发现与哈密尔顿距离d有关,如果哈密尔顿距离大于mid无论怎么改都不可能到达,同时还要满足哈密尔顿距离与mid大小同奇偶,因为只要同奇偶,且哈密尔顿距离满足要求,则可以利用对称走法互相抵消; 5 #include6 using namespace std; 7 const int N=2e5+5; 8 int sx[N],sy[N],n,tx,ty; 9 10 int check(int i,int j) 11 { 12 int len=j-i+1; 13 int x=sx[n]-(sx[j]-sx[i-1]); 14 int y=sy[n]-(sy[j]-sy[i-1]); 15 int d=abs(x-tx)+abs(y-ty); 16 if(len>=d&&((d-len)%2==0))return 1; 17 return 0; 18 } 19 int main() 20 { 21 22 cin>>n; 23 string s; 24 cin>>s; 25 cin>>tx>>ty; 26 if(abs(ty)+abs(tx)>n||(tx+ty-n)&1)puts("-1"); 27 else 28 { 29 for(int i=1;i<=n;i++) 30 { 31 sx[i]=sx[i-1]; 32 sy[i]=sy[i-1]; 33 if(s[i-1]=='R')sx[i]++; 34 else if(s[i-1]=='L')sx[i]--; 35 else if(s[i-1]=='U')sy[i]++; 36 else sy[i]--; 37 } 38 int l=0,r=n; 39 while(l<=r) 40 { 41 int mid=(l+r)>>1; 42 bool ok=false; 43 for(int i=1;i+mid-1<=n;i++) 44 { 45 int j=i+mid-1; 46 if(check(i,j)) 47 { 48 ok=true; 49 break; 50 } 51 } 52 if(ok)r=mid-1; 53 else l=mid+1; 54 } 55 cout< endl; 56 } 57 58 return 0; 59 }