题目链接: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\n"); 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\n"); 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\n"); 41 else 42 printf("YES\n"); 43 } 44 } 45 } 46 return 0; 47 }