L2-045 推宝塔(STL模拟)

本题传送门

解题思路

与前面的插松枝题目的思路类似,STL模拟题务必要保证思路逻辑清晰。

顺序:

  1. 拿个C,看能不能放A上。

  2. 如果不行,再看看能不能放B上。

  3. 要是还不行,就按题目要求(这里由于比较复杂,一定要认真读题,我就是没读好题,这题后面出现了问题),先把A上的截止,作为一件成品,然后把B上比C大的放到A上,最后再把C放到A上。

  4. 最后,如果A上还有,就作为一个成品,然后把B上的逐一放到A上作为成品。

注意:每有一件成品,就要统计其高度,题目要求最后输出最大高度。凡是涉及到容器的删除操作,一定要先判空。

思考🤔:如果题目还要求输出宝塔具体情况呢?
插松枝就是输出具体情况,本题是输出最大高度,那完全可以再出一道题,既要输出具体情况还要输出最大值。

#include<iostream>
#include<stack>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
	int n;cin>>n;
	stack<int> a,b;int count = 0 ;
	int max_h = 0;
	
	for(int i = 0 ; i <n ; i++)
	{
		int c;cin>>c;
        //与前面的插松枝思路有相似之处
        //1. 什么时候能放A上
		if(a.empty() || c < a.top())
		{
			a.push(c);
		}
        //能放B上吗
		else if(b.empty() || c > b.top())
		{
			b.push(c);
		}
        //都放不了,就进行下一步复杂操作
		else 
		{
			count++;//首先把A取下来
			max_h = max(max_h , (int)a.size());//结束一个就统计一个
			while(!a.empty()) a.pop();
            //把b上的转移到a上,必须得判空
			while(b.size() && b.top() > c)
			{
				a.push(b.top());
				b.pop();
			}
			a.push(c);//最后把c也放上去
		}
	}
	if(a.size())//如果最后a上面还有
	{
		count++;
		max_h = max(max_h , (int)a.size());
	}
	if(b.size())//如果B上还有剩余的
	{
		count++;
		max_h = max(max_h , (int)b.size());
	}
	cout<<count<<" "<<max_h<<endl;
	return 0;
}
posted @ 2026-03-19 21:01  shuiwangrenjia  阅读(22)  评论(0)    收藏  举报