题解驾驶山猫

Posted kcn999

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题解驾驶山猫相关的知识,希望对你有一定的参考价值。

题目描述

  lxl作为一名老司机,他十分喜欢驾驶他的山猫护幼。由于zyl嫉妒lxl开山猫的技术高超,zyl yy了一段路来考验lxl的驾驶技术。他要求lxl要从0的位置驾驶到m的位置,且这段路中有 n 个位置上有石头。

  lxl的车自然不能撞到石头上。为了防止这种情况,他可以将车在地上助跑至少 s 个单位后在空中飞至多 d 个单位。现在他想知道,他应该如何经过这一段路呢?

输入格式

  第一行输入四个整数 n,m,s,d ,分别表示障碍数,路程长度,助跑最小长度,飞行最大长度。

  第二行输入 n 个整数,表示 n 个石头的位置 w1,w2,...,wn 。保证 {wi} 为递增序列。

 

输出格式

  输出若干行,表示你开车的过程,每个过程有两种:

  RUN X表示在地上开X个单位长度,不能有两个连续的RUN命令。

  JUMP X表示在空中飞X个单位长度,这个命令的前一个操作要求要助跑距离不少于 s ,飞的长度不超过 d 。

  如果有多种过程能到达终点,允许输出任意一种。另外,你需要保证 1≤X≤10^9 且最后车在的位置恰好为 m ,允许结束时的最后一个命令为JUMP。

  如果不能到达终点,输出Impossible。


输入样例

3 10 1 3
3 4 7

 

输出样例

RUN 2
JUMP 3
RUN 1
JUMP 2
RUN 2

样例解释

技术图片

 

数据范围

  对于40%的数据, n≤10

  对于70%的数据, n≤4000

  对于100%的数据, 1≤n≤200000 , 2≤m≤10^9 , 1≤s,d≤10^9 , 1≤wi≤m-1 , wi<wi+1

  X 为 1 到 10^9 内的整数

 

题解

  显然根据贪心策略·,能走就不飞,我们记录路径即可。

技术图片
#include <iostream> 
#include <cstdio>

#define MAX_N 200000

using namespace std;

int n, m, s, d;
int a[MAX_N + 5]; 
int st[MAX_N + 5], cnt;

int main()
{
    scanf("%d%d%d%d", &n, &m, &s, &d);
    for(register int i = 1; i <= n; ++i)
    {
        scanf("%d", a + i);
    }    
    if(d < 2 || s >= a[1]) 
    {
        printf("Impossible");
        return 0;
    }
    st[++cnt] = 1;
    for(register int i = 2; i <= n; ++i)
    {
        if(a[i - 1] + s + 1 < a[i]) 
        {
            st[++cnt] = i;
        }
        else if(a[i] - a[st[cnt]] + 2 > d) 
        {
            printf("Impossible");
            return 0;
        }
    }
    printf("RUN %d\n", a[1] - 1);
    for(register int i = 2; i <= cnt; ++i)
    {
        printf("JUMP %d\n", a[st[i] - 1] - a[st[i - 1]] + 2);
        printf("RUN %d\n", a[st[i]] - a[st[i] - 1] - 2);
    }
    printf("JUMP %d\n", a[n] - a[st[cnt]] + 2);
    if(a[n] + 1 < m) printf("RUN %d", m - a[n] - 1);
    return 0;
}
参考程序

 

以上是关于题解驾驶山猫的主要内容,如果未能解决你的问题,请参考以下文章

特斯拉自动驾驶造假实锤:总监出马亲自作证,撞车片段被删,所有功能均为预编程...

网络流 搭配飞行员题解

[AutoCars]自动驾驶汽车概述(下)

Java 求解划分字母区间

2017.07.16【NOIP提高组】模拟赛B组 卫星照片 题解

软件工程(2018)第二次结对作业