首页 > 其他分享 >CF1716C Robot in a Hallway题解

CF1716C Robot in a Hallway题解

时间:2022-10-21 20:58:18浏览次数:59  
标签:Hallway 走法 题解 oplus1 Robot 时间 max now 转移

\(2000\) 分的 DP 题。

题意

给定一个 \(2\) 行 \(n\) 列的网格。机器人初始坐标为 \((0,1)\),每一秒都可以向四周移动。每个格子有解锁时间,在该时间之前机器人不可以进入该格子。每个网格只可以遍历一遍,求机器人遍历整个网格图的最少时间。\(n\leq2*10^5\)。

思路

显然,由于每个网格只能遍历一遍,机器人只有两种走法:

1.从当前格子一直向右行走,到达第 \(n\) 列拐弯,再一直向左移动;
2.蛇形走法。

一开始的思路,状态设计成了 \(f_{i,j,k}\) 表示当前要向 \(k\) 方向走到 \((i,j)\) 的最小时间。发现当方向为向左时,状态要从 \(f_{i,j+1,k}\) 转移而来,有后效性。

再次思考性质,发现我们并没有必要走到一个格子后再停下来,等待它的解锁时间。我们可以直接计算好这一条路径所需要等待的总时间,结果便是等待的时间加上格子数了。

该怎么实现呢?观察到蛇形走法的结果可以边走边由直线走法的结果推算出来,于是考虑对直线走法的结果进行预处理。设 \(f_{i,j}\) 表示从 \((i,j)\) 开始,要向右边移动的最小等待时间。

如何转移?在不考虑不同行之间的情况时,显然可以得到:

\(f_{i,j}=max(f_{i,j+1}-1,a_{i,j})\)。

加上不同行的情况,即蛇形走法后怎么办呢?考虑到如果从 \((i,j)\) 开始向右移动,终点一定是 \((i\oplus1,j)\)。显然答案要从终点转移过来。故转移方程变为:

\(f_{i,j}=max(f_{i,j+1}-1,max(a_{i\oplus1,j}-2*(n-j)-1,a_{i,j}))\)。

转移方程是怎么来的呢?有的小朋友就有疑问了。\((i,j)\) 走到 \((i\oplus1,j)\) 的路径,不是等同于由 \((i,j)\) 走到 \((i,n)\),再拐个弯走到 \((i\oplus1,j)\) 吗?那这样的路径显然可以用 \((i,j+1)\) 的状态来转移啊,为什么非要从终点转移过来呢?因为你忘记考虑时间锁的限制了。\((i,j+1)\) 的时间锁和 \((i\oplus1,j)\) 的时间锁不一定相同,所以如果两种情况用同一种状态转移的话,答案是错误的。故需要用 \((i\oplus1,j)\) 的时间锁限制减去机器人移动 \((n-j)\) 列所需的时间,再减去拐弯所需的 \(1\) 个时间作为转移状态。

最后,枚举一下蛇形走法的路径,统计一下最小值就可以了。

Code

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define db double
int T=1,n,a[2][200010],f[2][200010],ans,now;
void solve(){
	cin>>n;
	for(int i=0;i<=1;i++){
		for(int j=1;j<=n;j++){
			cin>>a[i][j];
		}
	}
	a[0][1]=-1;
	f[0][n]=max(a[1][n]-1,a[0][n]);
	f[1][n]=max(a[0][n]-1,a[1][n]);
	for(int i=0;i<=1;i++){
		for(int j=n-1;j>=1;j--){
			f[i][j]=max(f[i][j+1]-1,max(a[i^1][j]-2*(n-j)-1,a[i][j]));
		}
	}
	ans=f[0][1]+2*n,now=a[1][1]+1;
	for(int i=2,p=1;i<=n;i++,p^=1){
		ans=min(ans,now+((f[p][i]-now)>0?f[p][i]-now:0)+2*(n-i+1));
		now=max(now+1,a[p][i]+1);
		now=max(now+1,a[p^1][i]+1);
	}
	cout<<min(ans,now)<<endl;
	for(int i=1;i<=n;i++) f[0][i]=f[1][i]=0;
	return ;
}
int main(){
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	cin>>T;
	while(T--){
		solve();
	}
	return 0;
}

标签:Hallway,走法,题解,oplus1,Robot,时间,max,now,转移
From: https://www.cnblogs.com/wh2t3zz/p/16814724.html

相关文章

  • CF1045G 题解
    前言题目传送门!更好的阅读体验?和模版稍有不同的cdq分治。思路cdq是离线算法,所以我们可以先给\(x_i\)离散化一下。同时,记录下\((x_i-r_i)\)与\((x_i+r_i)......
  • robotframework自动化测试框架实战教程:创建及使用监听器(listener)接口
    RobotFramework提供了一个监听器(listener)接口可以用来接收测试执行过程中的通知. 监听器通过在命令行中设置选项 --listener 来启用,和导入测试库类似,你也可以指定......
  • 关于LoRa常见问题解答
    前面的文章中,小编有写过LORA技术低功耗广域网络,在大大小小的行业活动中,一直都是物联网的一个热门话题。LoRa主要在全球免费频段运行,包括433、868、915MHz等。后来有很多......
  • 「题解」Codeforces 1730F Almost Sorted
    给定一个长度为\(n\)的置换\(p\),以及一个正整数\(k\).对于一个置换\(q\),要求对于所有满足\(1\leqi<j\leqn\)的\(i,j\),有以下不等式成立:\[p_{q_i}\leqp_{q_j}+......
  • accoders NOI #5014. 树上询问(query) 题解
    昨天刚刚做过一道类似的题,没想到在模拟赛当中出现了。题目描述有一棵\(n\)个结点的树,有\(m\)次询问,每次询问给你两个整数\(l,r\),问存在多少个整数\(k\)使得从\(l......
  • 顺丰科技智慧物流校园技术挑战赛 一份题解
    我只是做了代码裁缝的角色罢了目录​​试题地址​​​​1​​​​2​​​​3​​​​4​​​​5​​试题地址​​https://leetcode.cn/contest/sf-tech/​​1DFS判定有向图......
  • 题解 P5527 [Ynoi2012] NOIP2016 人生巅峰
    人生第一道Ynoi,同时也是1k通过。不卡常不难写,小清新Ynoi真的不多见了。前置知识:抽屉原理,树状数组,bitset,动态规划基础。首先考虑一个事实,当这个区间够长是必然有解的......
  • robotframework自动化测试框架实战教程:创建及使用测试库
    创建测试库测试库的实现可以是Python模块,也可以是Python类.Python模块   Python类 测试库通常在Setting表格中设置 Library 来导入,库名称跟在 Libra......
  • CF645E Intellectual Inquiry 题解
    传送门|无耻地宣传我的博客(矩乘代码在最后)看一眼题,没什么思路,那大概就是个dp了。先求已知序列的方案数。考虑怎么设计状态。因为本质不同,如果设\(f[i]\)表示,......
  • electron升级到20版本后,禁用第三方cookie、跨域问题解决方法
    最近公司的electron项目从13升级到最新的20版本,导致qq登录失效问题,特此记录1.qq扫码登录失效升级后之前的老版本可以扫码登录,但是新版本扫码登录后,页面直接刷新,没有登录......