原题链接:
解析:这题应该就是简单的堆模拟,如果看得懂英文题意的话不算难。我的做法利用了二叉树的一个性质,即从上往下从左往右依次为节点编号为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。
代码实例:
#includeusing 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;}