原题链接:PAT1147
解析:这题应该就是简单的堆模拟,如果看得懂英文题意的话不算难。我的做法利用了二叉树的一个性质,即从上往下从左往右依次为节点编号为0,1,2....,那么第i个节点的左子节点编号为2*i+1,右子节点2*i+2。
我第一次没通过的原因:刚开始我判断循环条件为2*i+2 < n,这样就有个问题,如果2*i+i < n但是2*i+2 > n就漏判了一个2*i+1。
代码实例:
#include<iostream>
using namespace std;
int num[1005];
int n,m;
bool isMax(){
for(int i = 0;2*i+1 < n;i++){
if(2*i+2 >= n)
if(num[i] < num[2*i+1]) return false;
if(2*i+2 < n)
if(num[i] >= num[2*i+1] && num[i] >= num[2*i+2]);
else return false;
}
return true;
}
bool isMin(){
for(int i = 0;2*i+1 < n;i++){
if(2*i+2 >= n)
if(num[i] > num[2*i+1]) return false;
if(2*i+2 < n)
if(num[i] <= num[2*i+1] && num[i] <= num[2*i+2]);
else return false;
}
return true;
}
void Print(int k){
if(k >= n) return;
Print(2*k+1);
Print(2*k+2);
if(k == 0) cout << num[k] << endl;
else cout << num[k] << " ";
}
int main()
{
cin >> m >> n;
while(m--){
for(int i = 0;i < n;i++) cin >> num[i];
int flag = 0;
if(isMax()) flag = 1;
if(isMin()) flag = 2;
if(flag == 1) cout << "Max Heap" << endl;
else if(flag == 2) cout << "Min Heap" << endl;
else cout << "Not Heap" << endl;
Print(0);
}
return 0;
}