【L2-032 彩虹瓶】天梯赛L2系列详解

天梯赛L2-032 彩虹瓶

题目详情:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

思路:

题目的大概意思:
1、把一堆数顺序排放从1——N,然后再搞乱,让你给他们一个接一个顺序的匹配,
2、匹配的过程如果遇到不匹配的数,把这个数先放到货架上。
3、这个货架:可以存放暂时不匹配的数,但是这些数是以栈的形式存放:先进后出,并且货架是有大小的,如果存放的数超过货架,就是错误的。
4、匹配的时候,遇到不匹配的时候,把数放到货架上,遇到匹配的时候,直接匹配后,然后再去货架上看看,货架上的数,是不是下一个匹配的数。
5、给你一些匹配顺序,让你看看这写匹配的顺序是不是可以

所以我们要怎么做?
是不是有必要存放原来的那一堆数,当然可以用数组存放,但是仔细想想,用数组,数组也是通过下标来进行向后移动的,为什么不直接设置一个变量为1,然后累加呢?再设置一个栈,去当货架。

详细代码:

#include<bits/stdc++.h>
using namespace std;
int n,m,k;
stack<int>s;//货架
int flag = 1;//判断货架大小是否合适
int main()
{
	cin>>n>>m>>k;
	while(k--)
	{
		int need = 1;//需要匹配的数从1开始
		for(int i=0; i<n; i++)
		{
			int x;
			cin>>x;
			if(need == x)//数匹配上了
			{
				need++;//换下一个数匹配
				while(!s.empty())//看看货架上是否有可以匹配的数
				{
					if(s.top() == need)//货架上有匹配的数
					{
						s.pop();
						need++;//换下一个数匹配
					}
					else
					{
						break;//不匹配就跳出循环
					}
				}
			}
			else 
			{
				s.push(x);//存放在货架上
				if(s.size() > m)//如果货架的大小超了
			    {
			    	flag = 0;
				}
			}
		}
		if(need > n && flag == 1)//数匹配完了并且没有超过货架的大小
	        cout<<"YES\n";
	    else 
	        cout<<"NO\n";
	     /*恢复到初始状态*/
	    while(!s.empty())//清空栈
	        s.pop();
	    flag = 1;//恢复标志位
	}
}



知识总结:

思路特别重要。欢迎题友讨论题目,相互学习。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值