热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

CodeforcesContest1073problemCVasyaandRobot——尺取

VasyahasgotarobotwhichissituatedonaninfiniteCartesianplane,initiallyinthecell(0,0).Robotca

Vasya has got a robot which is situated on an infinite Cartesian plane, initially in the cell (0,0). Robot can perform the following four kinds of operations:

U — move from (x,y) to (x,y+1);
D — move from (x,y) to (x,y−1);
L — move from (x,y) to (x−1,y);
R — move from (x,y) to (x+1,y).
Vasya also has got a sequence of n operations. Vasya wants to modify this sequence so after performing it the robot will end up in (x,y).

Vasya wants to change the sequence so the length of changed subsegment is minimum possible. This length can be calculated as follows: maxID−minID+1, where maxID is the maximum index of a changed operation, and minID is the minimum index of a changed operation. For example, if Vasya changes RRRRRRR to RLRRLRL, then the operations with indices 2, 5 and 7 are changed, so the length of changed subsegment is 7−2+1=6. Another example: if Vasya changes DDDD to DDRD, then the length of changed subsegment is 1.

If there are no changes, then the length of changed subsegment is 0. Changing an operation means replacing it with some operation (possibly the same); Vasya can’t insert new operations into the sequence or remove them.

Help Vasya! Tell him the minimum length of subsegment that he needs to change so that the robot will go from (0,0) to (x,y), or tell him that it’s impossible.

Input
The first line contains one integer number n (1≤n≤2⋅105) — the number of operations.

The second line contains the sequence of operations — a string of n characters. Each character is either U, D, L or R.

The third line contains two integers x,y (−109≤x,y≤109) — the coordinates of the cell where the robot should end its path.

Output
Print one integer — the minimum possible length of subsegment that can be changed so the resulting sequence of operations moves the robot from (0,0) to (x,y). If this change is impossible, print −1.

Examples
inputCopy
5
RURUU
-2 3
outputCopy
3
inputCopy
4
RULR
1 1
outputCopy
0
inputCopy
3
UUU
100 100
outputCopy
-1
Note
In the first example the sequence can be changed to LULUU. So the length of the changed subsegment is 3−1+1=3.

In the second example the given sequence already leads the robot to (x,y), so the length of the changed subsegment is 0.

In the third example the robot can’t end his path in the cell (x,y).

题意:

给你一个长度为n的串,仅含有4种字符
U — move from (x,y) to (x,y+1);
D — move from (x,y) to (x,y−1);
L — move from (x,y) to (x−1,y);
R — move from (x,y) to (x+1,y).
差不多这个意思,就是移动的位置。
起始位置是0,0,然后给你一个目标位置,问你不可以增加,不可以减小这个串的长度,仅可以在其中选一个区间修改内容,问你到目标位置最少需要改的长度是多少。

题解:

首先特判目标位置的x+y大于n和目标位置与初始到达的位置是一样的情况,之后就是尺取,以前我都是用while来做,但是听说for一遍r会更好一点?那就试试看。每一个r我们找最大的l,让(r-l+1)这个长度是能够从当前位置到达目标位置的长度,但是要判断这两个是否奇偶,举个例子:
6
RLRLRL
1 0
这种情况怎么样都不可能到达了,因为(r-l+1)与位置偏差大小不是同奇偶的。

#include
using namespace std;
const int N=2e5+5;
char s[N];
mapmp;
int main()
{int sx&#61;0,sy&#61;0;int n;scanf("%d",&n);scanf("%s",s&#43;1);int fx,fy;scanf("%d%d",&fx,&fy);if(abs(fx)&#43;abs(fy)>n)return 0*printf("-1\n");for(int i&#61;1;i<&#61;n;i&#43;&#43;){if(s[i]&#61;&#61;&#39;U&#39;)sy&#43;&#43;;else if(s[i]&#61;&#61;&#39;D&#39;)sy--;else if(s[i]&#61;&#61;&#39;L&#39;)sx--;elsesx&#43;&#43;;}if(sx&#61;&#61;fx&&sy&#61;&#61;fy)return 0*printf("0\n");int l&#61;1,minn&#61;n&#43;1;for(int r&#61;1;r<&#61;n;r&#43;&#43;){if(s[r]&#61;&#61;&#39;U&#39;)sy--;else if(s[r]&#61;&#61;&#39;D&#39;)sy&#43;&#43;;else if(s[r]&#61;&#61;&#39;L&#39;)sx&#43;&#43;;elsesx--;while(l<&#61;r&&abs(fx-sx)&#43;abs(fy-sy)<&#61;r-l&#43;1){if(((abs(fx-sx)&#43;abs(fy-sy)))%2&#61;&#61;(r-l&#43;1)%2)minn&#61;min(minn,r-l&#43;1);if(s[l]&#61;&#61;&#39;U&#39;)sy&#43;&#43;;else if(s[l]&#61;&#61;&#39;D&#39;)sy--;else if(s[l]&#61;&#61;&#39;L&#39;)sx--;elsesx&#43;&#43;;l&#43;&#43;;}}printf("%d\n",minn&#61;&#61;n&#43;1?-1:minn);return 0;
}


推荐阅读
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • 前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 本文详细介绍了C语言中链表的两种动态创建方法——头插法和尾插法,包括具体的实现代码和运行示例。通过这些内容,读者可以更好地理解和掌握链表的基本操作。 ... [详细]
  • 本文详细探讨了VxWorks操作系统中双向链表和环形缓冲区的实现原理及使用方法,通过具体示例代码加深理解。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本题探讨了一种字符串变换方法,旨在判断两个给定的字符串是否可以通过特定的字母替换和位置交换操作相互转换。核心在于找到这些变换中的不变量,从而确定转换的可能性。 ... [详细]
  • 本实验主要探讨了二叉排序树(BST)的基本操作,包括创建、查找和删除节点。通过具体实例和代码实现,详细介绍了如何使用递归和非递归方法进行关键字查找,并展示了删除特定节点后的树结构变化。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • 本文详细介绍了 Apache Jena 库中的 Txn.executeWrite 方法,通过多个实际代码示例展示了其在不同场景下的应用,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ... [详细]
  • 根据最新发布的《互联网人才趋势报告》,尽管大量IT从业者已转向Python开发,但随着人工智能和大数据领域的迅猛发展,仍存在巨大的人才缺口。本文将详细介绍如何使用Python编写一个简单的爬虫程序,并提供完整的代码示例。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有