codeforces B. Petya and Staircases 解题报告

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

题目意思:给出整数n和m,表示有n级楼梯和m级dirty的楼梯,接下来m个数表示对应是哪一个数字的楼梯是dirty的楼梯,不一定是按小到大给定的,需要判断的是,在只可以走一级、二级或三级的情况,是否可以把所有的非dirty楼梯走完。当然,如果dirty的楼梯中包含第一级(初始位置)或者最后一级(最终位置),那么默认是不能走完非dirty楼梯的。

       由于给定的dirty楼梯的数字是任意无序的,所以先要排序再处理。接着判断,一旦如果dirty楼梯是连续的三个数字,那么就不能把所有的非dirty楼梯走完。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 const int maxm = 3000 + 10;
 8 int d[maxm];
 9 
10 int main()
11 {
12     int n, m, i, j, flag;
13     while (scanf("%d%d", &n, &m) != EOF)
14     {
15         if (m == 0)
16             printf("YES
");
17         else
18         {
19             for (i = 1; i <= m; i++)
20             {
21                 scanf("%d", &d[i]);
22             }
23             sort(d+1, d+m+1);
24             if (d[1] == 1 || d[m] == n)
25                 printf("NO
");
26             else
27             {   
28                 flag = 1;
29                 for (i = 1; i <= m-2; i++)
30                 {
31                     j = d[i];
32                     if (d[i] == j && d[i+1] == j+1 
33                         && d[i+2] == j+2)
34                     {
35                         flag = 0;
36                         break;
37                     }
38                 }
39                 if (!flag)
40                     printf("NO
");
41                 else
42                     printf("YES
");
43             }
44         }
45     }
46     return 0;
47 }


 

原文地址:https://www.cnblogs.com/windysai/p/3432358.html