2021天梯赛补题
完美二叉树的层序遍历
方法一:打表,这个是看到别人的方法,感觉很神奇,要是实在不会的时候可以试试。
#include<bits/stdc++.h>
using namespace std;
int main() {
int n,a[102],pos[102];
cin >> n;
for(int i=1; i<=n; i++) {
cin >> a[i];
}
if(n == 1) {
int tmp[]={1};
for(int i=0; i<n; i++) {
pos[i] = tmp[i];
}
} else if(n == 2) {
int tmp[]={2,1};
for(int i=0; i<n; i++) {
pos[i] = tmp[i];
}
} else if(n == 3) {
int tmp[]={3,1,2};
for(int i=0; i<n; i++) {
pos[i] = tmp[i];
}
} else if(n == 4) {
int tmp[]={4,2,3,1};
for(int i=0; i<n; i++) {
pos[i] = tmp[i];
}
} else if(n == 5) {
int tmp[]={5,3,4,1,2};
for(int i=0; i<n; i++) {
pos[i] = tmp[i];
}
} else if(n == 6) {
int tmp[]={6,3,5,1,2,4};
for(int i=0; i<n; i++) {
pos[i] = tmp[i];
}
} else if(n == 7) {
int tmp[]={7,3,6,1,2,4,5};
for(int i=0; i<n; i++) {
pos[i] = tmp[i];
}
} else if(n == 8) {
int tmp[]={8,4,7,2,3,5,6,1};
for(int i=0; i<n; i++) {
pos[i] = tmp[i];
}
} else if(n == 9) {
int tmp[]={9,5,8,3,4,6,7,1,2};
for(int i=0; i<n; i++) {
pos[i] = tmp[i];
}
} else if(n == 10) {
int tmp[]={10,6,9,3,5,7,8,1,2,4};
for(int i=0; i<n; i++) {
pos[i] = tmp[i];
}
}
/*......*/
for(int i=0; i<n; i++) {
printf(" %d"+!i,a[pos[i]]);
}
return 0;
}
方法二:
完全二叉树采用顺序存储方式,如果有左孩子,则编号为2i,如果有右孩子,编号为2i+1,然后按照后序遍历的方式(左右根),进行输入,最后顺序输出即可。
#include <iostream>
using namespace std;
int n, tree[31];
void create(int i) {
if (i > n)
return;
create(2 * i);
create(2 * i + 1);
cin >> tree[i];
}
int main() {
cin >> n;
create(1);
for (int i = 1; i <= n; i++) {
if (i > 1)
cout << " ";
cout << tree[i];
}
return 0;
}
网红店打卡
本题不难,当时两个测试点没有过,原因是代码出现失误,题目思路没有问题,问题在以下代码中已标红。教训:能用变量代替的数组尽量不开。
#include<bits/stdc++.h>
#include<algorithm>
#define ll long long
using namespace std;
const ll nl=1e5+5;
ll a[250][250];//当时定义了三个数组,长度都是201,数组开小了,题目中说不超过200个景点,但可以超过200条路径。
ll al[201];
ll bl[201]={0};
int main(){
ll n,m;
cin>>n>>m;
ll i,j;
ll x,y,d;
for(i=0;i<m;i++){
cin>>x;
cin>>y;
cin>>d;
a[y][x]=d;
a[x][y]=d;
}
ll k;
cin>>k;
ll t=0,tl=1e9+10,all=0,bll=0,cll=0;
while(k--){
all++;
ll z;
cin>>z;
i=0;
ll f=0;
cin>>al[0];
t=0;
if(z!=n){
f=1;
}
if(a[0][al[i]]==0){
f=1;
//cout<<"不能出发"<<endl;
}else{
bl[al[i]]++;
t+=a[0][al[i]];
}
for(i=1;i<z;i++){
cin>>al[i];
if(f==0){
if(a[al[i-1]][al[i]]!=0){
bl[al[i]]++;
t+=a[al[i-1]][al[i]];
}else{
f=1;
//break;当时多加了一个break,使得输入可能不完整。
//cout<<"中途出错"<<endl;
}
}
}
if(f==0){
if(a[0][al[z-1]]!=0){
t+=a[0][al[z-1]];
}else{
//cout<<"不能回家" <<endl;
f=1;
}
}
if(f==0){
for(i=1;i<=n;i++){
if(bl[i]!=1){
f=1;
//cout<<"多了或少了"<<endl;
break;
}
}
}
if(f==0){
cll++;
//cout<<all<<endl;
//cout<<t<<endl;
if(t<tl){
tl=t;
t=0;
bll=all;
}
}
for(i=0;i<=201;i++){
bl[i]=0;
}
}
cout<<cll<<endl;
cout<<bll<<" "<<tl;
}
浙公网安备 33010602011771号