本文主要是介绍CodeForces 342B--模拟+贪心,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题意:
有 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;
}
这篇关于CodeForces 342B--模拟+贪心的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!