ACWing 4217. 机器人移动

在一个无限大的二维平面上有一个机器人。

初始时,机器人位于点 (0,0)(0,0)。

机器人可以执行四种行动指令:

  • U — 从 (x,y)(x,y) 移动到 (x,y+1)(x,y+1);
  • D — 从 (x,y)(x,y) 移动到 (x,y−1)(x,y−1);
  • L — 从 (x,y)(x,y) 移动到 (x−1,y)(x−1,y);
  • R — 从 (x,y)(x,y) 移动到 (x+1,y)(x+1,y)。

给定一个长度为 nn 的指令序列,指令编号 1∼n1∼n,机器人将按顺序依次执行序列中的每个行动指令。

我们希望机器人最终抵达目标地点 (a,b)(a,b)。

为了达成这一目的,我们可能需要对指令序列进行修改。

每次修改可以选择其中一个指令,并将其替换为四种指令之一。

注意,只能对序列中的指令进行替换,不得随意删除指令或添加额外指令。

不妨设经过修改的指令中,编号最小的指令编号为 minIDminID,编号最大的指令编号为 maxIDmaxID。

我们定义修改成本为 maxID−minID+1maxID−minID+1。

例如,将 RRRRRRR 修改为 RLRRLRL,则编号为 2,5,72,5,7 的指令经过了修改,修改成本为 7−2+1=67−2+1=6。

请你计算,为了使得机器人能够最终抵达目标点 (a,b)(a,b),所需花费的最小修改成本。

如果不需要对序列进行修改,则成本为 00。

输入格式

第一行包含整数 nn。

第二行包含一个长度为 nn 的字符串,表示指令序列,字符串中只包含 UDLR

第三行包含两个整数 a,ba,b,表示机器人的目标位置为 (a,b)(a,b)。

输出格式

输出一个整数,表示最小修改成本。

如果无论如何修改,机器人都无法抵达目标位置,则输出 −1−1。

数据范围

前四个测试点满足 1≤n≤101≤n≤10。
所有测试点满足 1≤n≤2×1051≤n≤2×105,−109≤x,y≤109−109≤x,y≤109。

输入样例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 #include<bits/stdc++.h>
 6 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<<l<<endl;
56   }
57   
58   return 0;
59 }

 

上一篇:Python实现的常用排序方法


下一篇:AcWing 327 玉米田