题目描述
一个CPU处理的任务队列,并不总是按照时间顺序处理,有些任务有着更高的优先级。比如:一个任务需要对核反应堆进行调度,另一个任务是打印一个文档。
针对这种需要处理优先级的任务选择执行场景,需要设计一种数据结构,高效率实现以下两种操作,从集合中定位并删除最大值(执行任务),在集合中插入新元素(新增任务)。堆就是这样一种数据结构。
堆是一种完全二叉树:0号节点为根结点,i号的左子为2*i+1,右子为2*i+2。按照内部元素的大小关系,堆可以分为大顶堆和小顶堆两种。
大顶堆(降序堆):每个结点的值都大于或等于其左右孩子结点的值
小顶堆(升序堆):每个结点的值都小于或等于其左右孩子结点的值
可以用数组去实现堆的存储。
本题给出用数组实现的堆包含的所有元素,请判断其是大顶堆,小顶堆,或者不是堆呢?
输入格式
输入第一行为大于等于2且小于100的一个正整数n,代表数组中元素个数
第二行为空格分割的n个正整数,代表数组中的每个元素
输出格式
输出包括一行
如果是大顶堆,输出Big Heap
如果是小顶堆,输出Small Heap
如果不满足堆堆条件,输出Not Heap
输入样例
6
5 16 30 33 15 38
输出样例
Not Heap
代码展示
哎呀,感觉写太麻烦了
#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int main(){
//freopen("/config/workspace/test/test","r",stdin);
int n;
cin>>n;
int a[100];
int maxnum=-1;
int minnum=INT_MAX;
for(int i=0;i<n;i++){
cin>>a[i];
if(a[i]>maxnum) maxnum=a[i];
if(a[i]<minnum) minnum=a[i];
}
if(n==2){
if(a[0]>a[1]) cout<<"Big Heap"<<endl;
else if(a[0]<a[1]) cout<<"Small Heap"<<endl;
return 0;
}
int flag=0;
int i;
a[n]=minnum;
for(i=0;i<n/2;i++){
if(a[i]>=a[2*i+1]&&a[i]>=a[2*i+2])
continue;
else{
break;
}
}
if(i==n/2) flag=1;
if(flag==0){
a[n]=maxnum;
for(i=0;i<n/2;i++){
if(a[i]<=a[2*i+1]&&a[i]<=a[2*i+2])
continue;
else{
break;
}
}
if(i==n/2) flag=2;
}
if(flag==0) cout<<"Not Heap"<<endl;
else if(flag==1) cout<<"Big Heap"<<endl;
else if(flag==2) cout<<"Small Heap"<<endl;
return 0;
}
//闲叙题外话:最近天气不错呀,虽然有点点冷,但是阳光很温暖很舒服