【PTA-训练day26】L2-035 完全二叉树的层序遍历 + L2-036 网红点打卡攻略 + L2-037 包装机

目录

L2-035 完全二叉树的层序遍历 - 后序遍历+树+dfs

L2-036 网红点打卡攻略 - 模拟+建图

L2-037 包装机 - 栈模拟


L2-035 完全二叉树的层序遍历 - 后序遍历+树+dfs

PTA | 程序设计类实验辅助教学平台

思路:

  • 后序遍历是LRD
  • 完全二叉树是父节点为u,则左孩子为u*2,右孩子为u*2+1
  • 从节点1开始dfs,按后序遍历的顺序先走左孩子,走到最后面应该是后序遍历最先输出的点
  • 可以发现:dfs是一层一层深入的,dfs存从节点1开始层序遍历的下标u,tr[u]即存后序遍历遍历到的点
#include <bits/stdc++.h>
using namespace std;

const int N=55;
int n,cnt;
int pos[N],tr[N];

void dfs(int u)
{
    //LRD 后序遍历顺序
    if(u*2<=n) dfs(u*2); //如果有左孩子,则一路向下
    if(u*2+1<=n) dfs(u*2+1); //如果有有孩子,则往下走
    tr[u]=pos[++cnt];
}

int main()
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>pos[i];
    
    dfs(1);
    
    for(int i=1;i<=n;i++)
    {
        if(i!=1) cout<<" ";
        cout<<tr[i];
    }
}

L2-036 网红点打卡攻略 - 模拟+建图

PTA | 程序设计类实验辅助教学平台

#include <bits/stdc++.h>
using namespace std;

const int N=210,M=N*N;
int n,m;
int h[N],ne[M],e[M],w[M],idx;

void add(int a,int b,int c)
{
    e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}

int main()
{
    cin>>n>>m;
    memset(h,-1,sizeof h);
    while(m--)
    {
        int a,b,c;
        cin>>a>>b>>c;
        add(a,b,c); add(b,a,c);
    }
    int q;
    int res=0x3f3f3f3f,residx,rescnt=0;
    cin>>q;
    for(int i=1;i<=q;i++)
    {
        int cnt;
        vector<int> psum,road;
        cin>>cnt;
        road.push_back(0);
        while(cnt--)
        {
            int x;
            cin>>x;
            psum.push_back(x);
            road.push_back(x);
        }
        road.push_back(0);
        
        if(psum.size()>n) continue; //如果重复打卡 则不满足条件
        set<int> st;
        for(int x:psum) st.insert(x);
        if(st.size()<n) continue; //如果打卡点数少 也不满足条件
        
        bool f=false; //标志用于检测这一条打卡路线通不通
        int spd=0;
        for(int j=0;j<road.size()-1;j++)
        {
            int t=road[j];
            f=false; //标志用于检测某条打卡路线通不通
            for(int k=h[t];k!=-1;k=ne[k])
            {
                int tt=e[k];
                if(tt==road[j+1])
                {
                    spd+=w[k];
                    f=true;
                    break;
                }
            }
            if(!f) break; //如果不通 则这条路废了不用继续走下去了
        }
        if(!f) continue; //不通的路不参与最小花费的比较
        rescnt++;
        if(res>spd)
        {
            res=spd;
            residx=i;
        }
        
    }
    cout<<rescnt<<endl<<residx<<" "<<res;
    
}

L2-037 包装机 - 栈模拟

PTA | 程序设计类实验辅助教学平台

#include <bits/stdc++.h>
using namespace std;

const int N=110,M=1010;

int main()
{
    int n,m,s;
    cin>>n>>m>>s;
    getchar();
    string a[n+1][1];
    int st[n+1][m];
    memset(st,0,sizeof st);
    stack<char> stk;
    for(int i=1;i<=n;i++) cin>>a[i][0];
    
    
    string res;
    while(true)
    {
        int x;
        cin>>x;
        if(x==-1) break;
        if(x==0&&!stk.empty())
        {
            res+=stk.top();
            stk.pop();
        }else if(x!=0)
        {
            for(int i=0;i<m;i++)
            {
                if(!st[x][i])
                {
                    st[x][i]=1;
                    if(stk.size()>=s)
                    {
                        res+=stk.top();
                        stk.pop();
                    }
                    char c=a[x][0][i];
                    stk.push(c);
                    break;
                }
            }
        }
    }
    cout<<res;
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值