扫地机器人【第十届】【省赛】【研究生组】python

参考文章:
hhhh 扫地机器人

题目:

在这里插入图片描述
在这里插入图片描述
思路:

  1. 先给每个机器人分配最少工作量rule,这个值等于总格子数除以机器人的数量
  2. 得到rule之后判断每个机器人能不能打扫完自己和之前机器人之间的格子,以及能不能扫完全部的格子,如果两个条件有一个不满足则给rule+1,然后再次进行判断.
  3. 还有已经打扫完的格子可以重复打扫

上代码,注释写的还是蛮详细的哈hh

def judge(done,rule):  
    #done是已经扫完的格子,rule是规定每个机器人人要打扫的格子数量
    #返回值True 意思是每个机器人负责rule个格子然后全部的格子都能被打扫完毕
    #返回值False 意思是rule太小 格子太多打扫不完所以要增加每个机器人的工作量
    for i in range(0,k):   #扫描每个机器人
                                    #机器人所处的位置减去之前打扫到的位置,必须小于规定打扫的范围,
                                    #否则就会有一些格子打扫不到 比如rule=3--robot=10--done=6
        if robot[i]-done <= rule:   #之前扫到6,但现在这个机器人位置在10,也就是说他往左边扫只能扫到7,有个格子扫不到
            if robot[i]<=done:       #确定当前机器人能扫完之后判断
                #判断当前机器人所处的位置,是不是已经被之前的机器人扫过了(格子可以重复打扫)
                #比如done=6 robot=5 ,0-6都被之前的机器人扫了 
                done = robot[i] + rule -1  #当前的机器人往右再打扫rule个格子,因为左边的格子都扫完了,从自身的格子开始打扫,所以要减1
            else:  #机器人所处的位置还没有被之前的机器人扫过 或者说robot位置左边的格子还没扫,robot需要先扫左边的格子,
                done = done+rule  #从done+1个格子开始扫(done+1个格子本身也需要扫)所以经过当前的打扫后,一共有done+rule个格子被扫完了
        else: #当前机器人工作的rule 太少了,不足以扫完之前机器人到当前机器人之间的全部格子 所以False
            return False

    if done<n:# 全部的机器人工作完之后,仍然没有扫完 说明rule还是太少,所以False\
        return False
    else:#done=n 或者 done>n 都可以,说明已经全部扫完了,说明rule 足够 不需要再增加了
        return True            

n,k = map(int,input().split())
robot=[]
for i in range(k):
    robot.append(int(input()))
robot.sort()#由小到大排序

foot=n//k   #初始先给每个机器人安排n//k个格子,比如10个格子3个机器人,一开始先给每个机器人安排3个格子,如果没打扫完,后面再添加
if n != k : # 保证不是每个点都是机器人
    while foot<=n:
        if judge(0,foot)==True:  #说明现在每个机器人的工作量足够打扫完全部的格子
            break               #则退出
        else:
            foot=foot+1          # 增加每个机器人的工作量
            
print(2*(foot-1))   # 步数=(总共打扫的格数-1)*2

最后:

至于这个步数为什么等于 2*(每个机器人扫的格数 -1)
举个栗子: robot在2位置 一共要扫四个格子
则它的工作顺序就是
2->1->2->3->4->3->2 一共工作了六步最后回到2原位置

测试结果
在这里插入图片描述

欢迎交流,共同进步

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值