题目: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
");return 0;
}
if(a[1]-1>=s)vis[1]=1;
else{
printf("IMPOSSIBLE
");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
");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
",p[i].second);
}
else{
printf("JUMP %d
",p[i].second);
}
}
return 0;
}