Codeforces 1296C - Yet Another Walking Robot

题目大意:

给定一个机器人的行走方式

你需要取走一段区间

但要保证取走这段区间后机器人最终到达的终点位置是不变的

问这段区间最短时是哪一段

解题思路:

易得,如果重复走到了某些已经走过的点,那么肯定就有一段区间可以被删除

但是行走次数最大有2e5,即用数组记录坐标状态的话起码要开4e5*4e5的空间,显然不可能

所以可以用map储存上一次走到某个坐标是第几步

那么每次只要判断当前的坐标是否已经被走过即可,走过的话就尝试更新答案

因为map中未调用过的int值为0

所以让原点的步数设置为1防止混淆

初始设置 l=0,r=n+1去最大化这个答案区间,便于第一次判断得以执行

然后,遍历这个字符串,如果发现某个点已经走过了,取出这个步数为 d

可以得到 d+1~i 这一段是可以删除的(d步不可取,因为那一步走完才能到达这个点)

那么就拿 i-(d+1) 和 r-l 作比较,即当 r-l>i-(d+1)  =>  r-l>=i-d 时,更新lr答案

最后把第一步的步数减回去就可以作为答案了(l=0,说明不存在)

对于这里的结构体运算符重载,因为使用map需要告知大小关系才能存入这颗红黑树进行排序(map是会根据键值进行大小排序先的,然后进行二分查找)

所以就重载了小于运算符,先按照x从小到大排,如果x相同按照y从小到大排

这样就可以在之后二分查找时能够准确找到值

然后是对等于的重载,在查找的最后需要判断找到的位置的键值和输入的是否相同(因为如果找不到输入的键值的话是会返回空的——int类型即数值0)

所以要重载等于运算符

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 struct P{
 5     int x,y;
 6     bool operator < (const P& a) const{
 7         return x<a.x||x==a.x&&y<a.y;
 8     }
 9     bool operator == (const P& a) const{
10         return x==a.x&&y==a.y;
11     }
12 };
13 string s;
14 void solve(){
15     int i,n,l,r,d;
16     cin>>n>>s;
17     map<P,int> mp;
18     P pd;
19     pd.x=pd.y=0;
20     mp[pd]=1;
21     l=0;r=n+1;//先最大化答案区间
22     s="  "+s;//下标向右移动2位,便于直接把i当作步数
23     for(i=2,n++;i<=n;i++){
24         if(s[i]==‘L‘)
25             pd.x--;
26         else if(s[i]==‘R‘)
27             pd.x++;
28         else if(s[i]==‘U‘)
29             pd.y++;
30         else
31             pd.y--;
32         d=mp[pd];
33         if(d>0){//这个点走过
34             if(r-l>=i-d)
35                 l=d+1,r=i;
36         }
37         mp[pd]=i;
38     }
39     if(l==0)
40         cout<<"-1\n";
41     else
42         cout<<l-1<<‘ ‘<<r-1<<‘\n‘;//因为原点步数为1,把差值减回去
43 }
44 int main(){
45     ios::sync_with_stdio(0);
46     cin.tie(0);cout.tie(0);
47     int T;cin>>T;while(T--)
48         solve();
49
50     return 0;
51 }

原文地址:https://www.cnblogs.com/stelayuri/p/12262316.html

时间: 2024-10-09 01:24:59

Codeforces 1296C - Yet Another Walking Robot的相关文章

【Leetcode_easy】874. Walking Robot Simulation

problem 874. Walking Robot Simulation 参考 1. Leetcode_easy_874. Walking Robot Simulation; 完 原文地址:https://www.cnblogs.com/happyamyhope/p/11252142.html

Codeforces 1154D - Walking Robot - [贪心]

题目链接:https://codeforces.com/contest/1154/problem/D 题解: 贪心思路,没有太阳的时候,优先用可充电电池走,万不得已才用普通电池走.有太阳的时候,如果可充电电池能够充一格电,就用普通电池跑(让可充电池充电),否则就用可充电电池走. AC代码: #include<bits/stdc++.h> using namespace std; const int maxn=2e5+10; int n,a,b; bool s[maxn]; int main()

Codeforces Round #617 (Div. 3) C. Yet Another Walking Robot

http://codeforces.com/contest/1296/problem/C 题意:给一段字符串表示移动,然后求删除最短的一段,并且不影响结果 题解: 意思是:建立pair点和map,当遍历到第i个点有一个pair值,把这个加到map里面,如果向后接着遍历时出现与i点相同的pair值时,那么这一段表示可以删除的一段 #include <bits/stdc++.h> using namespace std; int main() { #ifdef _DEBUG freopen(&qu

CodeForces 321 A - Ciel and Robot

[题目链接]:click here~~ [题目大意]:一个robot 机器人 ,可以根据给定的指令行动,给你四种指令,robot初始位置是(0,0),指令一出,robot会重复行动,判断能否在无限行动的情况下经过点(n,m). [解题思路]其实仔细模拟一下,可以发现是有周期的,判断即可,见代码吧~~ 代码: #include <iostream> #include <algorithm> #include <bits/stdc++.h> using namespace

874.Walking Robot Simulation(list不可被哈希)

A robot on an infinite grid starts at point (0, 0) and faces north. The robot can receive one of three possible types of commands: -2: turn left 90 degrees -1: turn right 90 degrees 1 <= x <= 9: move forward x units Some of the grid squares are obst

874. Walking Robot Simulation

A robot on an infinite grid starts at point (0, 0) and faces north.  The robot can receive one of three possible types of commands: -2: turn left 90 degrees -1: turn right 90 degrees 1 <= x <= 9: move forward x units Some of the grid squares are obs

[LeetCode] Walking Robot Simulation 走路机器人仿真

A robot on an infinite grid starts at point (0, 0) and faces north.? The robot can receive one of three possible types of commands: -2: turn left 90 degrees -1: turn right 90 degrees 1 <= x <= 9: move forward?x?units Some of the grid squares are obs

codeforces 979C Kuro and Walking Route

题意: 给出一棵树,其中有两个点,x和y,限制走了x之后的路径上不能有y,问可以走的路径(u,v)有多少条,(u,v)和(v,u)考虑为两条不同的路径. 思路: 简单树形dp,dfs统计在x到y路径(不包括x和y)之外的所有点,在x这边的有a个,y这边的有b个,那么答案就是n*(n-1) - a * b. 代码: 1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 #include &l

B - Snow Walking Robot

题意:给出一段表方向的字符串,u.d.l.r分别表示向上.向下.向左.向右,让你重新排列,使其走出去再回到原点,除了原点能走两次以外其他点都只能走一次,输              出走的次数和走法. 思路:最简单的走法:就是绕一圈,先全是上,再全是右,全是下,全是左,即上的次数==下的次数,左的次数==右的次数,求两组对应方向的较小值,两值之和的两倍            即是走的次数. 有一个方向出现次数是0,则对应的反方向则也为0,另外两个方向就只能各一个,例如:上出现次数是0,则只有一种