题目
扫地机器人 – 蓝桥云课 (lanqiao.cn)https://www.lanqiao.cn/problems/199/learning/?page=1&first_category_id=1&name=%E6%89%AB%E5%9C%B0%E6%9C%BA%E5%99%A8%E4%BA%BA
思路和解题方法
- 首先,通过
cin
语句输入了终点位置n和障碍物数量k。- 使用一个数组a来存储k个障碍物的位置。
- 对障碍物位置进行排序,以便后续的二分搜索。
- 然后,定义了一个函数
check
,用于检查是否能够在给定的时间内到达终点。该函数采用二分搜索的思想。- 在
check
函数中,首先初始化当前位置为起点0。然后遍历每一个障碍物:- 当所有障碍物都走过后,判断当前位置是否小于终点位置n,若小于则返回false,表示无法在给定时间内到达终点;否则返回true,表示可以在给定时间内到达终点。
- 主函数使用二分搜索来找到最短时间。初始化二分搜索的左边界l为0,右边界r为2 * n。
- 在while循环中,计算中间值mid,并调用
check
函数判断是否能在mid时间内到达终点。- 最终输出答案ans,即为最短时间到达终点的结果。
复杂度
时间复杂度:
O(log N * K)
空间复杂度
O(K)
c++ 代码
#include<iostream>
#include<algorithm>
using namespace std;
int n, k, a[100005]; // 定义变量n(终点位置)、k(障碍物数量)、a数组存放k个障碍物的位置
int ans; // 存放最终答案
// 检查是否能够在给定的时间内到达终点
bool check(int time)
{
int pos = 0; // 当前位置初始化为起点
for(int i = 0; i < k; ++i) // 遍历每一个障碍物
{
int t = time; // t表示剩余时间
if(pos < a[i]) // 如果当前位置小于障碍物位置
t -= (a[i] - pos - 1) * 2; // 则需要额外花费时间走过去
if(t < 0) // 如果剩余时间不足以到达当前障碍物
return false; // 返回false,表示无法在给定时间内到达终点
pos = a[i] + t / 2; // 更新当前位置为走过障碍物后的位置
}
if(pos < n) // 如果所有障碍物都走过后,仍未到达终点
return false; // 返回false,表示无法在给定时间内到达终点
return true; // 否则返回true,表示可以在给定时间内到达终点
}
int main()
{
cin >> n >> k; // 输入终点位置n和障碍物数量k
for(int i = 0; i < k; i++)
cin >> a[i]; // 输入k个障碍物的位置
sort(a, a + k); // 对障碍物位置进行排序
int l = 0, r = 2 * n; // 初始化二分搜索的左右边界
while(l <= r) // 二分搜索
{
int mid = l + (r - l) / 2; // 取中间值
if(check(mid)) // 能够在mid时间内到达终点
ans = mid, r = mid - 1; // 更新答案并缩小右边界
else
l = mid + 1; // 否则扩大左边界
}
cout << ans << endl; // 输出答案
return 0;
}
未优化的代码 暴力 time从0~2*n
for(int i = 0;i<=2*n;i++)
{
if(check(i)){
ans = i;
break;
}
}
时间对比
双指针_冷yan~的博客-CSDN博客https://blog.csdn.net/jgk666666/category_12470278.html
如果愿意的话关注一下。会对你有更多的帮助。
原文地址:https://blog.csdn.net/jgk666666/article/details/134601706
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_9927.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。