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

CF1716C Robot in a Hallway 题解

时间:2024-09-18 15:02:55浏览次数:11  
标签:截距 Hallway int 题解 leftarrow Robot -- 时间 max

容易发现合法路径一定形如:先弯弯曲曲地走(即向下、向右、向上、向右地移动),再直接向右走到头,碰到边界后折回来。

所以考虑枚举弯曲地走的部分,这部分的最快时间容易求出。只需考虑快速求出剩余部分的最快时间,设对于第 \(i\) 第 \(j\) 列,这个时间为 \(f_{i, j}\)。

发现移动和等待格子解锁实质上可以描述为在平面上移动:若平面的 \(x\) 轴为路程,\(y\) 轴为时间,移动一步相当于 \(x \leftarrow x + 1, y \leftarrow y + 1\);等待一秒相当于 \(y \leftarrow y + 1\)。这样得到的折线会分为很多段,为了方便处理,将一部分折线向上平移使得其构成一条直线,显然这样不会影响答案。(它的实际意义是在一开始就完成所有等待)这条直线的截距即为需要等待的时间。

求截距是一个常见套路:设走过的格子的解锁时间依次组成序列 \(t_1, t_2, t_3, \cdots t_m\),则上述直线的截距为 \(\max\limits_{i = 1}^m \{ t_i - i \}\)。

于是容易求出剩余部分的最快时间 \(f_{i, j}\),时间复杂度 \(O(n)\)。

#include <iostream>

#define int long long

using namespace std;

int n;
int a[2][200005];
int f[2][200005];

static inline int max(int x, int y, int z) { return max(max(x, y), z); }

static inline void solve() {
    cin >> n;
    for (int i = 1; i <= n; ++i)
        cin >> a[0][i];
    for (int i = 1; i <= n; ++i)
        cin >> a[1][i];
    a[0][1] = -1;
    f[0][n] = max(a[1][n] - 1, a[0][n]);
    for (int i = n - 1; i; --i)
        f[0][i] = max(f[0][i + 1] - 1,
                      a[1][i] - 2 * (n - i) - 1,
                      a[0][i]);
    f[1][n] = max(a[0][n] - 1, a[1][n]);
    for (int i = n - 1; i; --i)
        f[1][i] = max(f[1][i + 1] - 1,
                      a[0][i] - 2 * (n - i) - 1,
                      a[1][i]);
    int ans = min(f[0][1] + 2 * n, a[1][1] + max(0ll, f[1][2] - a[1][1] - 1) + 2 * n - 1);
    int sum = a[1][1] + 1;
    for (int i = 2; i <= n; ++i) {
        sum = max(sum, a[(i & 1) ^ 1][i]) + 1;
        sum = max(sum, a[i & 1][i]) + 1;
        ans = min(ans, sum + max(0ll, f[i & 1][i + 1] - sum) + 2 * (n - i));
    }
    cout << ans << endl;
}

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int T;
    cin >> T;
    while (T--)
        solve();
    return 0;
}

标签:截距,Hallway,int,题解,leftarrow,Robot,--,时间,max
From: https://www.cnblogs.com/bluewindde/p/18418532

相关文章

  • Python 命令跳转微软应用商店问题解决办法
    最常见的解决办法就是在环境变量中将Python安装路径上移至  %USERPROFILE%\AppData\Local\Microsoft\WindowsApps 路径前。但是有时候这个办法也无法起效,那么此时可以进入系统设置中,将应用执行别名中的python项关闭。其路径在:应用>高级应用设置>应用执行别名 ......
  • P2898 [USACO08JAN] Haybale Guessing G 题解
    并查集好题首先我们知道并查集是可以维护一个区间的覆盖问题的,具体操作就是,对于一个区间,我们让所有的点都有一个指针,这个指针指向这个区间的右端点+1(具体操作可以每个点指向右边,这样后面我们查到一个点的时候用路径压缩就可以了,能从\(\Theta(nlogn)\)变成\(\Theta(n)\)),这样我们......
  • 洛谷P8774 [蓝桥杯 2022 省 A] 爬树的甲壳虫 题解 期望DP
    题目链接:https://www.luogu.com.cn/problem/P8774思路:设\(f_i\)为甲壳虫从高度\(i\)到达高度\(n\)因为从高度\(i\)走\(1\)步有\(1-P_{i+1}\)的概率到达高度\(i+1\),有\(P_{i+1}\)的概率到达高度\(0\),所以:\(f_i=1+(1-P_{i+1})\timesf_{i+1}+P_{i+1}\times......
  • 洛谷P4550 收集邮票 题解 期望DP
    题目链接:https://www.luogu.com.cn/problem/P4550解题思路:定义状态\(f_i\)表示目前已经取到\(i\)种邮票的情况下,取完所有\(n\)很明显,\(f_n=0\),因为此时已经取完了\(n\)如果当前已经取到了\(i\)有\(\frac{i}{n}\)的概率取到现有的邮票(此时仍然拥有\(i\)有\(1-\frac{i......
  • 2024 CCPC 网赛题解
    G最大流#include<queue>#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#defineMAXN205#defineINF0x3f3f3f3f3f3f3f3f#defineLLlonglong#defineIntregisterintusingnamespacestd;inlinevo......
  • 洛阳师范学院 ACM实验室 中秋娱乐赛“月饼代码大逃杀”题解
    题解包括C和C++两种语言_壹我要洋人死!1、直接输出即可C语言题解:#include<stdio.h>intmain(){printf("woyaoyangrensi!");return0;}C++语言题解:#include<iostream>usingnamespacestd;intmain(){ printf("woyaoyangrensi!"); return0;}......
  • [AGC004E] Salvage Robots
    题意给定一个网格图,图上有若干个机器人和一个出口。每次操作让所有机器人向上、下、左、右移动一格,若有机器人走出边界,则直接移除该机器人,若有机器人走到出口,则回收该机器人并移除。问可以回收到的机器人的最大数量。\(n\le100\)。Sol首先套路地,考虑把移动所有机器人......
  • P11072 Alice and Bob 题解
    简单博弈题。先说结论,如果存在\(a_i=0\)使得\(1\lei\lea_1\)的话,那么先手必胜,否则后手必胜。若满足上述条件显然先手必胜,将\(0\)搞到第一个就行。否则Alice每操作一次,如果操作后满足了上述条件,那么Bob赢,否则Bob只要不动就行。但是下一轮Alice必须动,要不然两......
  • 【洛谷 P1048】[NOIP2005 普及组] 采药 题解(动态规划+01背包)
    [NOIP2005普及组]采药题目描述辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株......
  • 历年CSP-J初赛真题解析 | 2019年CSP-J初赛阅读程序(16-33)
    学习C++从娃娃抓起!记录下CSP-J备考学习过程中的题目,记录每一个瞬间。附上汇总贴:历年CSP-J初赛真题解析|汇总_热爱编程的通信人的博客-CSDN博客#include<cstdio>#include<cstring>usingnamespacestd;charst[100];intmain(){scanf("%s",st);intn......