刚开始拿到这道题的时候错误的做法:
1 //相邻之间的数小于等于M 2 //首先弹出来的数小于等于M 3 #include<stdio.h> 4 #include<math.h> 5 #define MAXN = 1000000; 6 int M,N,K; 7 int main(){ 8 int pre,now,i,j,flag=0; 9 scanf("%d %d %d",&M,&N,&K); 10 for(i=0;i<K;i++){ 11 flag = 0; 12 scanf("%d",&now); 13 if(now>M) flag=1; 14 for(j=1;j<N;j++){ 15 pre = now; 16 scanf("%d",&now); 17 if(abs(pre-now)>M) flag=1; 18 } 19 if(flag==1) printf("NO\n"); 20 else printf("YES\n"); 21 } 22 23 return 0; 24 }
后来发现问题后,重新选择的方法:
1 #include<stdio.h> 2 #define MAXN 10000 3 int M,N,K; 4 int b[MAXN],stack[MAXN],top; 5 int detect(); 6 int main(){ 7 int p,i,j,flag=0; 8 scanf("%d %d %d",&M,&N,&K); 9 b[0] = N; 10 for(i=0;i<K;i++){ 11 for(j=1;j<=N;j++){ 12 scanf("%d",&b[j]); 13 } 14 if(detect()==1) printf("YES\n"); 15 else printf("NO\n"); 16 } 17 return 0; 18 } 19 int detect(){ 20 int i,j,value,flag,start; 21 top = 0; 22 stack[top] = b[0]; 23 start= 1; 24 25 for(i=1;i<=b[0];i++){ 26 value = b[i]; 27 flag = 0; 28 for(j=1;j<=top;j++){ 29 if(stack[j]==value) flag = 1; 30 } 31 //不在栈中 32 if(flag==0){ 33 //前面的元素入栈 34 if(start<=value){ 35 for(j=start;j<=value;j++){ 36 ++top; 37 if(top>M) return 0; 38 else stack[top] = j; 39 } 40 start = value+1; 41 top--; 42 } 43 44 } 45 //在栈中 46 else{ 47 if(stack[top]!=value) return 0; 48 else top--; 49 50 } 51 52 } 53 return 1; 54 }
总结:使用了栈的方法,注意栈的容量问题。
来源:https://www.cnblogs.com/Learn-Excel/p/12610772.html