VK Cup 2016 - Qualification Round 1 - D. Running with Obsta(模拟)

本文介绍了一种模拟算法,用于解决在X轴上避开障碍物并达到终点的问题。该算法考虑了助跑距离和跳跃限制,确保角色能够有效且合理地越过障碍。文章通过实例详细解释了解决方案的设计思路与实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载自:http://www.cnblogs.com/ember/p/5727011.html

题意 :

在 x 坐标轴上,从 0 到 m 点,中途有 n 个障碍,遇到障碍可以 跳,
但是每次跳之前需要一段 距离为 s 的“助跑 ”,而且每次跳跃距离不能超过 d ,不能落在障碍点上;
给出 n,m,s,d,接下来 n 个数 ,表示障碍的坐标。
输入保证起点和终点不会有障碍,不会有两个障碍在同一位置。 
输出到达终点的过程。如果不能到达终点输出“IMPOSSIBLE” 。

解题:

模拟啊模拟(好烦好烦= =)

首先 他一定是跑到距离障碍最近的位置才跳的,这样可以跳的更远些。
然后两个障碍之间相距 要大于等于 s+2 ,才可以再次跳,否则不能到达终点了。 
所以只要在 d 范围里找到了这样 一段距离(只要起始位置包含在 d 里就可以辣) 就继续往前跳。 
为了方便把数组的 n+1 位 设置成 a[n+1] = m+1; 
这样判断的时候如果 到了最后的位置就不判断直接跳过去。

#include<cstdio>
#include<cstring> 
#include<algorithm>
#include<iostream>
#include<string>
#define ll __int64
using namespace std;
const int maxn = 200010;
ll a[maxn],ans[maxn];
int main()
{
    int n,m,s,d;
    scanf("%d%d%d%d",&n,&m,&s,&d);
    for(int i=1;i<=n;i++)
        scanf("%I64d",&a[i]);        
    sort(a+1,a+n+1); 
    a[n+1] = m+1;    
    ll pos = a[1] - 1, las = 0;
    int cnt = 0, f = 0;
    ans[cnt++] = pos - las;    
    for(int i=1;i<=n;i++) {
        if(pos - las >= s) { //如果满足跳的条件 
            int j, fg = 0;
            for(j = i+1; j<=n+1 ; j++) { 
                if( a[i]-pos >= d) break;  // d范围内寻找  
                if( ( (a[j]-1) - (a[i]+1) >= s) || (j==n+1) ){
                    fg = 1; break;
                }                                 
                i ++ ;
            }
            if(!fg) { 
                 f = 1; break;
            }  
            las = a[i] + 1;
            ans[cnt++] = las - pos; 
            pos = a[j] - 1;    
            ans[cnt++] = pos - las;        
        }
        else {
            f = 1; break;
        }        
    }
    if(f) printf("IMPOSSIBLE\n");
    else {
        for(int i=0;i<cnt;i++) {
            if(ans[i]) 
                printf((i%2)?"JUMP %I64d\n":"RUN %I64d\n",ans[i]);            
        }
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值