CodeForces 637D Running with Obstacles(贪心模拟)

题意:有一个长度为m的跑道,上面有n个障碍物需要跳过去,每次可以跳D米,但是必须先跑S米,让你输出一种方案能让人跑完全程,否则输出IMPOSSIBLE

思路:直接贪心模拟,能跑就跑,能跳就跳,不过细节挺多的得慢慢写


#include <cstdio>
#include <queue>
#include <cstring>
#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <map>
#include <string>
#include <set>
#include <ctime>
#include <cmath>
#include <cctype>
using namespace std;
#define maxn 400005
#define LL long long
int cas=1,T;
int a[maxn],flag[maxn],dist[maxn];
int n,m,s,d,t;
bool solve()
{
	if (a[1]<=s)return false;
	int now=a[1]-1;
	flag[t]=0,dist[t]=now,t++;
	for (int i = 1;i<n;i++)
	{
		if (a[i+1]-a[i]<=s+1)continue;
		if (a[i]+1-now>d)return false;
		flag[t]=1,dist[t]=a[i]+1-now,t++;
		flag[t]=0,dist[t]=a[i+1]-a[i]-2,t++;
		now=a[i+1]-1;
	}
	if (a[n]+1-now>d)
		return false;
	flag[t]=1,dist[t]=a[n]+1-now,t++;
	if (a[n]+1!=m)
		flag[t]=0,dist[t]=m-a[n]-1,t++;
	for (int i = 0;i<t;i++)
	{
		if (flag[i])
			printf("JUMP ");
		else
			printf("RUN ");
		printf("%d\n",dist[i]);
	}
	return true;
}
int main()
{
	while (scanf("%d%d%d%d",&n,&m,&s,&d)!=EOF)
	{
		for (int i = 1;i<=n;i++)
			scanf("%d",&a[i]);
		sort(a+1,a+1+n);
		if (!solve())
			puts("IMPOSSIBLE");
	}
	//freopen("in","r",stdin);
	//scanf("%d",&T);
	//printf("time=%.3lf",(double)clock()/CLOCKS_PER_SEC);
	return 0;
}

Description

A sportsman starts from point xstart = 0 and runs to point with coordinate xfinish = m (on a straight line). Also, the sportsman can jump — to jump, he should first take a run of length of not less than s meters (in this case for these s meters his path should have no obstacles), and after that he can jump over a length of not more than d meters. Running and jumping is permitted only in the direction from left to right. He can start andfinish a jump only at the points with integer coordinates in which there are no obstacles. To overcome some obstacle, it is necessary to land at a point which is strictly to the right of this obstacle.

On the way of an athlete are n obstacles at coordinates x1, x2, ..., xn. He cannot go over the obstacles, he can only jump over them. Your task is to determine whether the athlete will be able to get to the finish point.

Input

The first line of the input containsd four integers nms and d (1 ≤ n ≤ 200 0002 ≤ m ≤ 1091 ≤ s, d ≤ 109) — the number of obstacles on the runner's way, the coordinate of the finishing point, the length of running before the jump and the maximum length of the jump, correspondingly.

The second line contains a sequence of n integers a1, a2, ..., an (1 ≤ ai ≤ m - 1) — the coordinates of the obstacles. It is guaranteed that the starting and finishing point have no obstacles, also no point can have more than one obstacle, The coordinates of the obstacles are given in an arbitrary order.

Output

If the runner cannot reach the finishing point, print in the first line of the output "IMPOSSIBLE" (without the quotes).

If the athlete can get from start to finish, print any way to do this in the following format:

  • print a line of form "RUN X>" (where "X" should be a positive integer), if the athlete should run for "X" more meters;
  • print a line of form "JUMP Y" (where "Y" should be a positive integer), if the sportsman starts a jump and should remain in air for "Y" more meters.

All commands "RUN" and "JUMP" should strictly alternate, starting with "RUN", besides, they should be printed chronologically. It is not allowed to jump over the finishing point but it is allowed to land there after a jump. The athlete should stop as soon as he reaches finish.

Sample Input

Input
3 10 1 3
3 4 7
Output
RUN 2
JUMP 3
RUN 1
JUMP 2
RUN 2
Input
2 9 2 3
6 4
Output
IMPOSSIBLE


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值