标签:iostream str 最大 closed led 解释 include run pos
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; }
标签:iostream str 最大 closed led 解释 include run pos
原文地址:https://www.cnblogs.com/kcn999/p/10805265.html