codeforces B. Xenia and Spies 解题报告

题目链接:http://codeforces.com/problemset/problem/342/B

题目意思:有n个spy,编号从1~n,从左到右排列。现在的任务是,spy s要把信息传递到spy f,但必须要满足:当spy li ~ spy ri 被观看时,这一段spy不能传递信息。

     要注意的是,step数(也就是ti)不一定是按顺序排列下来的,它有可能与上一行的step相差好几轮。此时,这好几轮中,spy s 是可以继续往spy f的方向传递信息的,直到移动完这好几轮的数目为止。除此,有可能m未完全输出完,spy s已经把信息传到spy f 中了;还有编号为 s 的spy编号有可能比spy f的编号小, 这些都是需要考虑的。

     模拟题,考的就是细心,还有考虑周全!!!

    

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     int n, m, s, f;
 9     while (scanf("%d%d%d%d", &n, &m, &s, &f) != EOF)
10     {
11         int move = (s > f ? -1 : 1);   // 记录是往左移还是往右移
12         int current, l, r;
13         int next = 1;  // next的设置很重要,它关乎到当前step和上一行的step间隔多少来处理消息的移动
14         current = 0;
15         while (s != f)
16         {
17             if (current < next && m > 0)
18             {
19                 scanf("%d%d%d", &current, &l, &r);
20                 m--;
21             }
22             if (current == next && ((s >= l && s <= r) || s + move >= l && s + move <= r))  // "||"后面的条件容易遗忘,它表示当移动一步后是否处于被看的序列中,如果是则不能移动
23                 printf("X");
24             else 
25             {
26                 printf("%c", s > f ? 'L' : 'R'); 
27                 s += move;
28         //        printf("s = %d\n", s);
29             }
30             next++;
31     //        printf("\ncurrent = %d, next = %d\n", current, next);
32         }
33         while (m--)   // 未到达m行,消息已经成功传递到spy f中,此时要继续执行到m行为止
34             scanf("%d%d%d", &current, &l, &r);
35         printf("\n");
36     }
37     return 0;
38 }

 

posted @ 2013-10-04 12:07  windysai  阅读(322)  评论(0)    收藏  举报