L2-045 推宝塔(STL模拟)
解题思路
与前面的插松枝题目的思路类似,STL模拟题务必要保证思路逻辑清晰。
顺序:
-
拿个C,看能不能放A上。
-
如果不行,再看看能不能放B上。
-
要是还不行,就按题目要求(这里由于比较复杂,一定要认真读题,我就是没读好题,这题后面出现了问题),先把A上的截止,作为一件成品,然后把B上比C大的放到A上,最后再把C放到A上。
-
最后,如果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;
}

浙公网安备 33010602011771号