ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ACWing 4217. 机器人移动

2022-02-01 23:01:41  阅读:124  来源: 互联网

标签:4217 int 机器人 样例 mid 修改 指令 ACWing


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

初始时,机器人位于点 (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 }

 

标签:4217,int,机器人,样例,mid,修改,指令,ACWing
来源: https://www.cnblogs.com/matt-su/p/15859861.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有