Codeforces 637D 模拟

题目:Codeforces 637D
题意:
有个人从0点走到m点,中间点会有障碍,他必须跨过去,但是在跨之前,必须跑一段距离,至少是s,然后他就可以跨越不大于d的距离,给出障碍点,问他能不能走到最后。
分析:
这场的题目叙述好难理解,这题我已开始读错题了,一位每个障碍是一段距离,WA了好几次,后来一读原来是点,晕~~ 后来改了一下就A了。简单说一下思路:因为有的障碍物之间的距离太小,所以不可以助跑,先预处理一遍,分别把可以直接跨越的和不可以直接跨越的标记一下。然后在从头开始扫一遍,因为一定是跑跳跑跳…的结构,所以每次都把跑跳的距离计算一下,放了容器里保存一下,中间判断一下是否会有的距离太大超过可以跨越的距离。最后输出结果就好。

#include<bits/stdc++.h>
using namespace std;
const int N=200005;
typedef pair<int,int>pii;
int a[N];
bool vis[N];
int main()
{
    int n,m,s,d;
    //freopen("f.txt","r",stdin);
    scanf("%d%d%d%d",&n,&m,&s,&d);
    for(int i=0;i<n;i++)scanf("%d",&a[i]);
    a[n]=0;a[n+1]=m;
    sort(a,a+n+2);
    for(int i=2;i<=n+1;i++){
        if(a[i]-a[i-1]-2>=s){
            vis[i]=1;
        }
    }
    if(d<2){
         printf("IMPOSSIBLE\n");return 0;
    }
    if(a[1]-1>=s)vis[1]=1;
    else{
         printf("IMPOSSIBLE\n");return 0;
    }
    vector<pii>p;int cnt=0;
    for(int i=1;i<=n;i++){
        if(vis[i]){
            p.push_back(pii(1,a[i]-cnt-1));
            int j=i+1;
            while(!vis[j]&&j<=n)j++;
            if(j==i+1){
                p.push_back(pii(2,2));cnt=a[i]+1;continue;
            }
            int dd=a[j-1]-a[i]+2;
            if(dd>d){
                printf("IMPOSSIBLE\n");return 0;
            }
            p.push_back(pii(2,dd));
            i=j-1;
            cnt=a[j-1]+1;
        }
    }
    if(m-a[n]-1>0)p.push_back(pii(1,m-a[n]-1));
    for(int i=0;i<p.size();i++){
        if(p[i].first==1){
            printf("RUN %d\n",p[i].second);
        }
        else{
            printf("JUMP %d\n",p[i].second);
        }
    }
    return 0;
}
posted @ 2016-03-25 00:02  HARD_UNDERSTAND  阅读(184)  评论(0编辑  收藏  举报