您的位置:首页 > 理论基础

2017北大信科计算机机试G

2017-07-15 22:07 246 查看
题目:点击打开链接

4078:实现堆结构

查看
提交
统计
提示
提问

总时间限制: 3000ms 单个测试点时间限制: 1000ms 内存限制: 65536kB
描述

定义一个数组,初始化为空。在数组上执行两种操作:

1、增添1个元素,把1个新的元素放入数组。

2、输出并删除数组中最小的数。

使用堆结构实现上述功能的高效算法。

输入第一行输入一个整数n,代表操作的次数。

每次操作首先输入一个整数type。

当type=1,增添操作,接着输入一个整数u,代表要插入的元素。

当type=2,输出删除操作,输出并删除数组中最小的元素。

1<=n<=100000。
输出每次删除操作输出被删除的数字。
样例输入
4
1 5
1 1
1 7
2


样例输出
1


提示每组测试数据的复杂度为O(nlogn)的算法才能通过本次,否则会返回TLE(超时)

需要使用最小堆结构来实现本题的算法
分析:
节约时间可以使用stl中提供的堆算法,另外机试时数据可能比较弱,使用set,map,优先队列,sort等也不会超时
代码:
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> heap;
bool cmp(int x, int y){return x > y;}
int main(){
int n,op,num;
scanf("%d",&n);
make_heap(heap.begin(),heap.end(),cmp);
while(n--){
scanf("%d",&op);
if(op == 1){
scanf("%d",&num);
heap.push_back(num);
push_heap(heap.begin(),heap.end(),cmp);
}else{
pop_heap(heap.begin(),heap.end(),cmp);
printf("%d\n",heap.back());
heap.pop_back();
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: