天梯赛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;//恢复标志位
}
}
知识总结:
思路特别重要。欢迎题友讨论题目,相互学习。