NO.1
大佬们似乎觉得这题挺简单所以都说的不是很详细。。。我看了几个答案之后感觉似懂非懂的 然后想了一会 自己写了代码 SO,我在这详细说一哈这题怎么解
//开始找了很久的规律,啥也没找着,自己猜了个17分,最后还是得上网看带佬们的
//当一个数字已经出栈时,证明其它未出栈且比它小的数字必须在栈里面而且必须满足大在上的顺序
//因此我们只需要通过两个限制条件确定是否可能
//1.栈里面的数字是否超过给定的栈的长度
//2.栈里面的数字输出顺序是否正确
#include<stdlib.h>
#include<stdio.h>
using namespace std;
int main()
{
#if _LCL_
freopen("input.txt","r",stdin);
#endif
int M,N,K;
scanf("%d%d%d",&M,&N,&K);
int Sample[K+1][N+1]={0};
for(int i=1;i<=K;i++)
for(int j=1;j<=N;j++)
scanf("%d",&Sample[i][j]);
if(N==1) //N==1单列
{
printf("YES\n");
return 0;
}
int Max,StackLen,len,This,Next;
for(int i=1;i<=K;i++)
{
Max=0;
StackLen=0;
for(int j=1;j<N;j++)
{
This=Sample[i][j];
Next=Sample[i][j+1];
if(This>Max)
{
Max=This;
len=Max-(j-1);
if(len>StackLen) //需要的栈的长度
StackLen=len;
}
if(This<Max&&Next<Max&&This<Next) //入栈元素是否满足顺序要求
{
printf("NO\n");
break;
}
if(j==N-1)
{
if(StackLen>M)
printf("NO\n");
else
printf("YES\n");
}
}
}
return 0;
}