扫地机器人(二分算法+贪心算法)

  1. if(robot[i]-len<=sweep)这个代码的意思是------如果机器人向左移动len个长度后,比现在sweep的位置(现在已经覆盖的范围)还要靠左,就是覆盖连续不起来,呢么这个len就是有问题的,退出函数,再继续循环。

  2. 显然当每个机器人清扫的范围相同时,所用时间最小,所以这时候可以想到用二分算法,check条件(判断条件)是每个清扫范围都能被扫到。

输入:

10 3

5

2

10

输出:6

输出机器人清扫玩完所有区域至少花费的时间.

cpp 复制代码
#include<bits/stdc++.h>

using namespace std;

int robot[100010];

int n,k;
bool check(int len){
	int sweep=0;
	int i;
	for(i=1;i<=k;i++){
		if(robot[i]-len<=sweep){
			if(robot[i]<=sweep){
				sweep=robot[i]+len-1;
			}
			else{
				sweep=sweep+len;
			}
		}
		else{
			return 0;
		}
	}
	return sweep>=n;
}
int main()
{
	scanf("%d",&n);
	scanf("%d",&k);
	int i;
	for(i=1;i<=k;i++){
		scanf("%d",&robot[i]);
	}
	sort(robot+1,robot+k+1);
	int m,l=0,r=n,ans;
	while(l<=r){
		m=(r+l)/2;
		if(check(m)){
			r=m-1;
			ans=m;
		}
		else{
			l=m+1;
		}
	}
	printf("%d",(ans-1)*2);
	return 0;
}

3.if(robot[i]<=sweep)

这个代码的意思是robot[i]此时所处的位置在已经被上一个机器人清扫过的位置了,所以此时sweep的值为robot[i]向右走的len然后减去1(减去robot起始位置)

否则的话robot[i]此时所处的位置为上一个机器人还未清扫过的位置,此时这个机器人会优先往左清扫,即sweep=sweep+len;

4.sort(robot+1,robot+k+1);

sort函数的两个参数是排序的起点和终点位置,robot加1的原因是数组是从1开始排列的,而不是从0开始排列的。

5.if(check(m)){

r=m-1}是因为如果此时的m满足清扫的条件,呢么接下来应该找比m更小的范围(对应更小的时间)即往m的左区间更小的数去找。即r=m-1。

注:代码来自lanqiao6628158049

相关推荐
高锰酸钾_3 分钟前
计算机网络-网络层-路由算法与路由协议
计算机网络·算法·智能路由器
智者知已应修善业14 分钟前
51单片机4按键控制共阳LED霓虹灯切换1整体闪烁2流水下3流水上4间隔闪烁】2023-10-27
c++·经验分享·笔记·算法·51单片机
XW-ABAP28 分钟前
SAP ABAP 实现类似百度谷歌搜索引擎基础算法之一的,编辑距离算法
算法
嵌入式小能手37 分钟前
飞凌嵌入式ElfBoard-进程间的通信之信号处理sigaction
linux·算法·信号处理
re林檎40 分钟前
算法札记——5.14
算法
研究点啥好呢1 小时前
DJI 机器人视觉算法工程师 面试题精选:10道高频考题+答案解析(背诵版)
算法·面试·机器人·dji
热心网友俣先生1 小时前
2026年认证杯二阶段A题赛题解析
人工智能·算法·机器学习
Black蜡笔小新1 小时前
自动化AI算法训练服务器DLTM深度学习推理工作站AI赋能质检助力制造业智能化转型
人工智能·算法·自动化
小雅痞1 小时前
[Java][Leetcode simple] 205. 同构字符串
java·算法·leetcode
txg6661 小时前
机器人领域简报(2026年5月7日—5月13日)
人工智能·机器学习·机器人