文章

插松枝(2022天梯赛L2-1)

插松枝1.png插松枝2.png

栈和队列

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int a[maxn];//推送器的数量
int ans[maxn];//ans[0]目前数量 
int box[maxn];//box盒子目前数量 
int main()
{
    int n,m,k,topp=0,flag,i,j,tem,t;//ans的顶 
    cin>>n>>m>>k;//推送器 盒子容量  枝干的叶数量 
    for(i=1;i<=n;i++) cin>>a[i];
    box[0]=ans[0]=0;
    for(i=1;i<=n;i++){
        flag=0;
        tem=a[i];
        //盒子里面有东西,优先考虑盒子 
        if(box[0]!=0){
            t=box[0];
             if(ans[0]==0||box[box[0]]<=ans[ans[0]]){//ans没有东西||比ans小  放入
                ans[0]++;
                ans[ans[0]]=box[box[0]]; 
                box[0]--;
                flag=0;
            }else {//盒子里面的不满足条件 
                if(tem<=ans[ans[0]]){//放进枝叶 
                    ans[0]++;
                    ans[ans[0]]=tem;
                    flag=1;
                }else {//不能放进枝叶 
                    if(box[0]<m){//可以放入盒子 
                        box[0]++;
                        box[box[0]]=tem;
                        flag=1;
                    }else {//不能放入盒子  输出结果 
                        flag=0;
                        for(j=1;j<=ans[0];j++){
                            cout<<ans[j];
                            if(j!=ans[0]) cout<<' ';
                            else cout<<endl;
                        }
                        ans[0]=0;
                    }
                }
            }
        }else{//盒子里面没有东西 
            if(ans[0]==0||tem<=ans[ans[0]]){//可以放入树枝 
                ans[0]++;
                ans[ans[0]]=tem;
                flag=1;
            }else {//放进盒子 
                box[0]++;
                box[box[0]]=tem;
                flag=1;
            }
        }
        if(ans[0]==k){
                for(j=1;j<=k;j++){
                    cout<<ans[j];
                    if(j!=k) cout<<' ';
                    else cout<<endl;
                }
                ans[0]=0;
            }
        if(flag==1){
            
        }else {
            i--;
        }
    }
    while(box[0]!=0){
        if(ans[0]==k){
            for(j=1;j<=ans[0];j++){
                    cout<<ans[j];
                    if(j!=ans[0]) cout<<' ';
                    else cout<<endl;
                }   
            ans[0]=0;   
        }
        if(ans[0]==0||box[box[0]]<=ans[ans[0]]){
            ans[0]++;
            ans[ans[0]]=box[box[0]];
            box[0]--;
        }else {
            if(ans[0]!=0){
                for(j=1;j<=ans[0];j++){
                    cout<<ans[j];
                    if(j!=ans[0]) cout<<' ';
                    else cout<<endl;
                }   
            ans[0]=0;           
            }
        }
    }
    if(ans[0]!=0){
        for(j=1;j<=ans[0];j++){
            cout<<ans[j];
            if(j!=ans[0]) cout<<' ';
            else cout<<endl;
        }
    }
    return 0;
}
​
​

原题链接

https://pintia.cn/problem-sets/994805046380707840/exam/problems/1518582268930473984

License:  CC BY 4.0