codeforce div3 C Yet Another Walking Robot

在这里插入图片描述

题意大致讲的是给一个字符串,有四种操作,上下左右,如果可以选择一段尽可能短的操作删去,则输出删那一段,如果不行就输出-1;

做题时没有理解题意,就直接放弃了,回头来看,思路也停留在遍历,但没有想到如何遍历,看了一下题解,发现要用stl中的map,生成一个映射,记录这个坐标上一次出现的位置,也顺便学习一下map的用法,其实对这些stl,我也或多或少知道一点,但我发现一个知识如果只停留在知道那就没有任何意义。一定要把它实践应用才能彻底掌握,就像做课后作业,虽然枯燥但是有用,废话不多说。先记录一下map的一些简单用法
首先就是建立map 所需用到的指令是map<k,v>p;需要注意的是k是可以自由定义的变量,比如此题的k就是一个pair变量来存储坐标
下一个就是map的插入与赋值,下标法和insert都可以达到这个目的,例如p[x]=v;就是把x所对应的值赋为v,而insert则是p.insert(e)可以插入一个e进入map
最后在介绍一个count函数和find函数
若只是查找该元素是否存在,可以使用函数count(k),该函数返回的是k出现的次数;若是想取得key对应的值,可以使用函数find(k)具体写法也是p.count和p.find

至此关于map的简单应用介绍完毕,下面就把他应用到这道题的解题过程中对于每一个可能出现的坐标,记录他的出现位置,如果他出现次数大于1,则比较这次出现于上次出现的差值是否比现在的差值小,然后继续更新这个坐标上一次出现的位置。
代码实现如下


#include <bits/stdc++.h>
using namespace std;;
int main()
{
   int t;
	cin >> t;
	while (t--) {
		int n;
		string s;
		cin >> n >> s;
		int l = -1, r = n;//l表示当前可删除字符串最左边r为右边
       map<pair<int, int>, int> p;
		pair<int, int> flag = {0, 0};
		p[flag] = 0;
		for(int i=0;i<n;i++)
		{
			if (s[i] == 'L') --flag.first;
			if (s[i] == 'R') ++flag.first;
			if (s[i] == 'U') ++flag.second;
			if (s[i] == 'D') --flag.second;
			if(p.count(flag))
			{
				if (i - p[flag] + 1 < r - l + 1) {
					l = p[flag];
					r = i;
				}
			}
			p[flag]=i+1;
		}
		if(l==-1)
		cout << -1 << endl;
		else 
			cout << l + 1 << " " << r + 1 << endl;		//+1是因为字符串从零开始扫,现在问的是第几个 
		}
    return 0;
}


发布了48 篇原创文章 · 获赞 17 · 访问量 4477

猜你喜欢

转载自blog.csdn.net/weixin_45757507/article/details/104200908