【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 
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<

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

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

#include 
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 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 st;
        for(int x:psum) st.insert(x);
        if(st.size()spd)
        {
            res=spd;
            residx=i;
        }
        
    }
    cout<

L2-037 包装机 - 栈模拟

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

#include 
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 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=s)
                    {
                        res+=stk.top();
                        stk.pop();
                    }
                    char c=a[x][0][i];
                    stk.push(c);
                    break;
                }
            }
        }
    }
    cout<

你可能感兴趣的:(PTA每日刷题计划,深度优先,算法,图论,pta,模拟)