目录
L2-035 完全二叉树的层序遍历 - 后序遍历+树+dfs
L2-035 完全二叉树的层序遍历 - 后序遍历+树+dfs
思路:
- 后序遍历是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 网红点打卡攻略 - 模拟+建图
#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 包装机 - 栈模拟
#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;
}