题意:
有 n 个人站在一条线上,先要将一个东西从从 s 手里传到 e 手里,每一秒可以传给相邻的一个人,在t[i]时间内,有 l[i] 到 r[i] 区间内的人会被监视,被监视的人不能传递和接受东西,在第t[i]秒时,手上握有纸条的人,可以选择不传或者往左往右传,请问要怎么传才可以最快将纸条从第s个人传到第f个人手上。
分析:
始终将 s 向 e 的方向去靠拢,统计从s到e的步数,如果从 s 到 e 所走的步数少于监视时间(一单位时间走一步),则s一定可以到e,这时只需要判断是L或者是R就行,如果步数大于监视时间,则需要进行判断,若在监视区间,则是输出X,若不在监视区间,k<l[i]-1||k>r[i],或者k<l[i]||k>r[i]+1,则可以到达,只需要判断L或者R就行,否则就是X。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int maxn =100000+10;
int t[maxn],l[maxn],to[maxn];
int main()
{
int num,n,s,e;
while(~scanf("%d%d%d%d",&num,&n,&s,&e))
{
for(int i=0; i<n; i++)
{
scanf("%d%d%d",&t[i],&l[i],&to[i]);
}
bool flag=false;
if(s<e)
{
int a=0,i=0;
while(!flag)
{
a++;
if(a<t[i])
{
s++;
printf("R");
}
else
{
if(s<l[i]-1 || s>to[i])
{
s++;;
printf("R");
}
else
{
printf("X");
}
i++;
}
if(s==e)
{
flag=true;
}
}
}
else
{
int a=0,i=0;
while(!flag)
{
a++;
if(a<t[i])
{
s--;
printf("L");
}
else
{
if(s<l[i] || s>to[i]+1)
{
s--;
printf("L");
}
else
{
printf("X");
}
i++;
}
if(s==e)
{
flag=true;
}
}
}
printf("\n");
}
return 0;
}