本质:stack+判断语句的应用;
思路:若A柱子能放则放A(数字要逐渐减少),不然放B柱子(数字要逐渐增大),若都不满足,
则完成一个宝塔(清空A),再把B柱子里大于当前数字的数推入A;一直重复。
因为不需要正确的输入每一个塔的数字,所以用两个stack就可以了;
不废话了,上代码详解
#include<iostream>
#include<vector>
using namespace std;
#include<stack>
int maxlen=0;
int sum=0;
stack<int> s,ss;//s为A柱子,ss为B柱子
void clear(){//清空A柱子
while(!s.empty()) s.pop();
}
int main(){
int num;
cin>>num;
while(num--){
int temp;
cin>>temp;
if(s.empty()||s.top()>temp) s.push(temp);//放入A
else if(ss.empty()||ss.top()<temp) ss.push(temp);//放入B
else{//都不能放,则要完成一个塔
maxlen=max(maxlen,(int)s.size());//找出最大塔
clear();
sum++;
while(!ss.empty()){//把B中符合条件的数字推入A
if(ss.top()>temp){
s.push(ss.top());
ss.pop();
}else break;
}
s.push(temp);
}
}//结束时,A,B柱子可能还存有没有完成的塔
//必须分别判断,因为这两柱子一定不能合成一个塔
if(!s.empty()){
sum++;
maxlen=max(maxlen,(int)s.size());
}
if(!ss.empty()){
sum++;
maxlen=max(maxlen,(int)ss.size());
}
cout<<sum<<' '<<maxlen;
return 0;
}