Codeforces edu C. Robot in a Hallway

题目要求在一个2行m列的矩阵中,以最短时间遍历所有点且每个点仅访问一次。矩阵中每个点在特定时间内会被锁定。解决方案包括蛇形和按行遍历策略,通过预处理分界点减少时间复杂度,避免超时。通过枚举分界点并计算不同情况下的最长时间,考虑终点列数的奇偶性,以确定最终的最短时间。
摘要由CSDN通过智能技术生成

题意,给一个两行m列的矩阵,要求遍历每一个点并且每一个点只能遍历一遍,并且每个点在开始的ai,j时间内都会锁住不能访问,要求最短时间

思路:稍加思索就能发现,对于一个只有两行的图来说,只有两种方式能遍历全图,且只访问每一个点一遍,分别是蛇形从小到大按列遍历,和按行遍历。由于该题给出的列数较多,我们按列来看,遍历的方式一定是从按列转向按行的(即使全是蛇形遍历,最后也会有一个竖向的按行遍历过程),因此,我们可以枚举分界点来找到最小值

于是我们发现了一个严酷的问题,如果对于每一个分界点都进行依次按行遍历的话,n^2的复杂度必然会导致超时,于是我们考虑预处理出所有分界点后按行遍历所需要的时间数,然后再枚举分界点。

于是我们发现仍有两种情况1.按行遍历不被卡,为a[i][j]+(n-i)*2或(n-i)*2-1的时间,或者被卡,从大到小按列取a[1-j][i]+1,dp[j][i+1]+1的最大值

最后再枚举分界点的时候需注意终点的列数如果是奇数,那么终点就在第一行,如果是偶数,那就在第二行。因此使用预处理出的按行遍历的dp值时需要注意奇偶。然后就是需要用一个变量记录枚举到i位置时的即使后面不卡也需要的最大时取max

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<algorithm>
#include<string>
#incl
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值