【天梯赛】L2-012(实战反思代码实现)
L2-012 关于堆的判断 - 团体程序设计天梯赛-练习集
实战反思
// 建立小顶堆的过程:接收一个,就插入一个
for (int i = 1; i <= N;i++){//建立小顶堆:记住,边插边建!
cin >> vec[i];
int k=i;
while(k>1 && vec[k]<vec[k/2]){
swap(vec[k],vec[k/2]);
k/=2;
}
}
//int idx = str.find(to_find, start)
注意:是从start开始向后查找,且包含start位置本身!
//ps: rfind(tofind, start)函数是从是从start开始向前查找,且同样包含start位置本身!
注意:没有找到返回-1,但是if(-1)会被判断为true,所以应该用if(str.find(to_find) == -1)表示查找失败
//字符串转整数:stoi(str)
//误:兄弟节点的判断:兄弟 != 存储位置差为一,后者有可能并非同属于一个父亲
对于完全二叉树,用 idx1 / 2 == idx2 / 2来判断
代码实现
#include<bits/stdc++.h>
using namespace std;
//重复数字?
int find_idx(int val, vector<int>vec)
{
for(int i=1; i<vec.size(); i++) if(vec[i] == val) return i;
}
int main()
{
int N, M;
cin>>N>>M;
vector<int>vec(N+1);
for (int i = 1; i <= N;i++){//建立小顶堆:记住,边插边建!
cin >> vec[i];
int k=i;
while(k>1 && vec[k]<vec[k/2]){
swap(vec[k],vec[k/2]);
k/=2;
}
}
string str;
getline(cin, str);
for(int i=0; i<M; i++)
{
getline(cin, str);
int idx = str.find(' ');//利用空格号确定语句中数字的位置
string str_num = str.substr(0, idx);//误!作用:从起始位置开始提取idx个字符!
int num1 = stoi(str_num);
int idx1 = find_idx(num1, vec);
if(str.find("root") != -1)//误!没找到返回-1,所以if(str.find("root"))在没找到时为true
{
if(idx1 == 1) cout<<"T"<<endl;
else cout<<"F"<<endl;
continue;
}
else if(str.find("siblings") != -1)
{
int lf = str.find(' ', idx+1);
int rt = str.find(' ', lf+1);//误!从查找位开始,但包含查找位!
str_num = str.substr(lf+1, rt-1-lf);
int num2 = stoi(str_num);//stoi函数不熟!
int idx2 = find_idx(num2, vec);
if(idx1 / 2 == idx2 / 2) cout<<"T"<<endl;//兄弟节点不等价于相邻存储!相邻的不一定有同一个father!
else cout<<"F"<<endl;
continue;
}
int lf = str.rfind(' ');//从该位置开始 向前 查找!
str_num = str.substr(lf+1, str.length()-1-lf);
int num2 = stoi(str_num);
if(str.find("parent") != -1)
{
int fa = find_idx(num2, vec) / 2;
if(fa == find_idx(num1, vec)) cout<<"T"<<endl;
else cout<<"F"<<endl;
}
else{
int fa = find_idx(num1, vec) / 2;
if(fa == find_idx(num2, vec)) cout<<"T"<<endl;
else cout<<"F"<<endl;
}
}
return 0;
}