PTA 1051

题目解决方案

  • 抓住一个核心的要点就是一个数想要出栈,1种情况是比它大的数都没有进来,另一种情况是比它大的都出去了。我们怎么判断是否有比它大的数呢?通过一个maxvalue来记录能弹出的最大值的最小值。你可能看到这个会有一些懵,我来解释一下。比如6 5 4这样的出栈顺序,我们读取6时,6是最大值,到5时,最大值是5了。如果再判断4-6会浪费时间,5已经可以弹出了,说明比五大的都没问题了,我们只需要判断4-5中间的数是否清理干净即可。
  • 还有一个注意的点是栈的长度有限制,这个怎么解决呢就是通过判断出栈的数是否更新了最大值,如果更新最大值,前面的数弹出的都比它小。这样的话,我们可以判断里面最多有maxvalue-i(对应的下标)个数,看是否小于栈的容量即可。
  • 具体的看代码细节吧。
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<vector>
#include<queue>
#include<string>

using namespace std;

int main(int argc, char** argv)
{
    int m,n,k;
    cin>>m>>n>>k;
    for(int i=0;i<k;i++)
    {	
    	int flag[1001]={0};
    	int maxvalue=-1;
    	bool ans=true;
    	for(int j=0;j<n;j++)
    	{	
    		int temp;
    		cin>>temp;
    		maxvalue=max(temp,maxvalue);
    		if(maxvalue==temp)
    		{
    			if(temp-j>m)
    			ans=false;
			}
			else
			{
				for(int k=temp+1;k<maxvalue;k++)
				{
					if(flag[k]==0)
					ans=false;
				}
			}
			flag[temp]=1;
			maxvalue=temp;
		}
		if(ans)
		cout<<"YES\n";
		else
		cout<<"NO\n";
	}
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodeUltraLab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值