PAT A1155 Heap Paths
Sample Input 1:
8
98 72 86 60 65 12 23 50
Sample Output 1:
98 86 23
98 86 12
98 72 65
98 72 60 50
Max Heap
Sample Input 2:
8
8 38 25 58 52 82 70 60
Sample Output 2:
8 25 70
8 25 82
8 38 52
8 38 58 60
Min Heap
Sample Input 3:
8
10 28 15 12 34 9 8 56
Sample Output 3:
10 15 8
10 15 9
10 28 34
10 28 12 56
Not Heap
- 思路 1:
- 先求路径:
DFS:对一个节点idex,如果他是叶子节点,输出路径返回,如果不是叶子节点,先压入vector然后进行试探,如果有左孩子DFS(左)如果有右孩子DFS(右),试探结束回溯,pop出来 - 再判断是什么堆:
-
1)从i=2开始遍历,如果所有孩子都比爹大,小根堆,都小,大根堆,否则不是堆
-
2)c++自带,heap的函数
is_heap(it_begin, it_end, cmp);
来判断 -
TIPS:比较器
less<int> ()
:默认大根堆greater<int> ()
:默认小根堆 -
code 1:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1100;
int n, in, ori[maxn];
vector<int> tmp;
bool cmp(int a, int b){
return a > b;
}
//左儿子=2*s 右=2*s+1 high=n
void DFS(int s){
if(2*s > n){
tmp.push_back(ori[s]);
for(int i = 0; i < tmp.size(); ++i){
printf("%d", tmp[i]);
if(i < tmp.size()-1) printf(" ");
else printf("\n");
}
tmp.pop_back();
return;
}
tmp.push_back(ori[s]);
if(2*s + 1 <= n) DFS(2*s + 1);
if(2*s <= n) DFS(2*s);
tmp.pop_back();
}
int main(){
scanf("%d", &n);
for(int i = 1; i <= n; ++i){
scanf("%d", &ori[i]);
}
DFS(1);
bool isMin = false, isMax = false;
for(int i = 2; i <= n; ++i){
if(ori[i/2] <= ori[i]) isMax = true; //有孩子都比爹大
if(ori[i/2] >= ori[i]) isMin = true; //有孩子都比爹小
}
if(isMin == false) printf("Min Heap"); //如果没有孩子都比爹小->都比爹大->小根堆
else if(isMax == false) printf("Max Heap"); //都比爹小->大根堆
else printf("Not Heap");
return 0;
}
- 使用is_heap():
if(is_heap(ori+1, ori+n+1)) printf("Max Heap");
else if(is_heap(ori+1, ori+n+1, cmp)) printf("Min Heap");
else printf("Not Heap");
- T2 code:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1010;
int seq[maxn];
bool is_max = true, is_min = true;
vector<int> tmp;
void DFS(int id, int n){
int r = 2 * id + 1, l = 2 * id;
tmp.push_back(seq[id]);
if(l > n){
printf("%d", tmp[0]);
for(int i = 1; i < tmp.size(); ++i){
printf(" %d", tmp[i]);
if(tmp[i-1] < tmp[i]) is_max = false;
else is_min = false;
}
printf("\n");
return;
}
if(r <= n){
DFS(r, n);
tmp.pop_back();
}
if(l <= n){
DFS(l, n);
tmp.pop_back();
}
}
int main(){
int n;
scanf("%d", &n);
for(int i = 1; i <= n; ++i){
scanf("%d", &seq[i]);
}
DFS(1, n);
if(is_min) printf("Min Heap");
else if(is_max) printf("Max Heap");
else printf("Not Heap");
return 0;
}
- T4 code:
#include <bits/stdc++.h>
using namespace std;
vector<int> seq;
vector<int> tmp;
void DFS(int id, bool & max_heap, bool & min_heap, int n)
{
if(id > n) return;
tmp.push_back(seq[id]);
if(id != 1)
{
if(seq[id] < seq[id / 2]) min_heap = false;
if(seq[id] > seq[id / 2]) max_heap = false;
}
if(2 * id > n)
{
for(int i = 0; i < tmp.size(); ++i)
{
printf("%d", tmp[i]);
if(i < tmp.size()-1) printf(" ");
else printf("\n");
}
tmp.pop_back();
return;
}
DFS(2 * id + 1, max_heap, min_heap, n);
DFS(2 * id, max_heap, min_heap, n);
tmp.pop_back();
}
int main()
{
int n;
scanf("%d", &n);
seq.resize(n+1);
for(int i = 1; i <= n; ++i)
{
scanf("%d", &seq[i]);
}
bool max_heap = true, min_heap = true;
DFS(1, max_heap, min_heap, n);
if(min_heap == max_heap)
{
printf("Not Heap");
}else if(max_heap)
{
printf("Max Heap");
}else
{
printf("Min Heap");
}
return 0;
}