| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 4217 机器人移动(二分 + 前缀和) -> 正文阅读 |
|
[数据结构与算法]4217 机器人移动(二分 + 前缀和) |
1. 问题描述: 在一个无限大的二维平面上有一个机器人。初始时,机器人位于点 (0,0)。机器人可以执行四种行动指令: 输入格式 第一行包含整数 n。第二行包含一个长度为 n 的字符串,表示指令序列,字符串中只包含 U,D,L,R。第三行包含两个整数 a,b,表示机器人的目标位置为 (a,b)。 输出格式 输出一个整数,表示最小修改成本。如果无论如何修改,机器人都无法抵达目标位置,则输出 ?1。 数据范围 前四个测试点满足 1 ≤ n ≤ 10。 输入样例1: 5 输出样例1: 3 输入样例2: 4 输出样例2: 0 输入样例3: 3 输出样例3: -1 2. 思路分析: 分析题目可以知道数据范围为10 ^ 5(先看题目的时间复杂度大概确定可以使用哪几种算法),所以我们只能够将算法的时间复杂度控制在O(n)或者是O(nlogn)以内,对于10 ^ 5级别的题目一般可以考虑二分能否解决,如何判断二分能否解决呢?关键是找到一个性质使得当前枚举的答案具有二段性,也即答案左边范围的数字都不符合要求,答案右边范围的数字都符合要求,对于这道题目来说我们需要找到一种性质使得在小于ans范围的都不能够到达目标位置,大于ans的范围的都可以到达目标位置,一般使用二分解决的难点是如何找到这种性质使得枚举的答案具有二段性: 对于这道题目来说这种性质可以表示为函数f,其中f(x)表示至多用x的代价能否让机器人到达目标位置,f(x) = true表示能够到达,为false为不可到达,当f(ans) = true的时候表示至多用ans的代价使得机器人到达目标位置,可以发现ans左边都不能到达目标位置,ans右边都可以到达目标位置,因为ans右边的可以通过+1,-1的操作抵消掉多余的操作使得最终到达目标位置,所以f(x)能够使得枚举的答案具有二段性;假设当前枚举的区间长度为len,也即我们需要判断是否能够最多花费len的代价使得到达目标位置,我们可以枚举[1,n]中所有区间所有长度为len的区间,判断是否存在一个区间使得可以通过任意改变当前枚举的长度为len的区间使得到达目标位置,因为当前枚举的是长度为len的区间[i,j],其实是将[1,n]分成了三段: 其中s1 + s3是一个固定的常量,s2其实属于一个变量,我们需要判断能否至多花费len的代价使得可以到达目标位置,可以看成是s2',而且s1,s2,s3都属于向量,向量满足交换律和结合律,所以s1 + s3可以看成到达了一个位置(x1,y1),所以问题就转化为了能够从(x1,y1)恰好走len步走到(x2,y2)(x2,y2属于目标位置),也即判断(x1,y1) + d = (x2,y2),d = (x2 - x1,y2 - y1),如果判断恰好通过len步到达(x2,y2)呢?其实可以画一下图会更清楚一点,而且不好判断的时候分析一下必要条件(很多时候比较都可以使用这种方法然后看是否是充分条件),可以发现一共是需要走len步,而且不是+1就是减1操作,所以能够到达目标位置得到的性质是:len >= |x2 - x1| + |y2 - y1|,因为恰好是走len步所以|x2 - x1| + |y2 - y1| - (d1 + d2 + ...dn)= 0,所以|x2 - x1| + |y2 - y1|与(d1 + d2 + ...dn)的奇偶性要相同,所以当能够到达目标位置的时候需要满足:
是否是充分条件呢?如果能够证明是充分条件那么我们就可以判断这两个条件来判断是否可以从当前位置到达目标位置了,证明充分性可以通过构造的方案,可以发现如果len >? |x2 - x1| + |y2 - y1|可以通过走相互抵消的步数从而到达目标位置所以可以证明上面的两个条件是充分必要条件,所以在二分的时候判断是否满足这两个条件即可。 3. 代码如下:
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 13:48:39- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |