问题 A: 动态中位数问题

时间限制: 1 Sec  内存限制: 8 MB
提交: 866  解决: 102
提交 状态 算法问答

题目描述

输入一组整数a1, a2, …, an ,每输入一个整数,输出到此时为止的中位数。

中位数定义:如果数串的大小是偶数 2j,中位数是从小到大排列的第 j 个数;如果数串的大小是奇数 2j+1,中位数是从小到大排列的第 j+1 个数。

输入

一组整数,数字和数字之间以空格隔开。

输出

一组整数,数字和数字之间以空格隔开。最后一个数后面也有空格。

第 i 个输出的整数,是前 i 个输入的中位数。

样例输入

-18 -2 14 -20 -6 7 2 14 11 6 

样例输出

-18 -18 -2 -18 -6 -6 -2 -2 2 2 

提示

时间复杂度请不要超过O(nlogn)。
由于输入输出的量会比较大,因此推荐使用c语言中的scanf和printf函数来进行输入输出,能比c++中cin和cout节省许多时间。

这里本来有一行提示,但是由于老师上课不小心说漏嘴了,于是助教狠心地把它注释掉了 ;

/*在处理该问题时,堆结构也许能给你带来意想不到的帮助。*/

答案

比较尴尬,最近一忙就忘记做了,所以答案没有经过oj测试,仅供参考(但测试用例一遍过了)

思路就是维护一个mid值、最大堆(存放比mid小的值)、最小堆(存放比mid大的值),每次读入一个数,根据两边堆的大小来判断当前值,具体怎么判断见代码注释,代码中有关STL中堆的使用操作就不多数了,自行查阅。

代码在VS2017上运行,在读入输出部分可能需要更改一下,scanf_s改scanf?

int main()
{
vector<int> heap_small; //这应该是个最大堆,存放着比mid小的元素
vector<int> heap_big; //这应该是个最小堆,存放着比mid大的元素
int mid =;
scanf_s("%d",&mid);
printf("%d ",mid);
int temp = ;
while (scanf_s("%d",&temp)!=EOF) {
if (temp < mid) {
if (heap_small.size() == heap_big.size()) {
//左侧和右侧一样大,将mid放入heap_big中,temp放入heap_small中,然后从heap_small选一个最大的作为mid
heap_big.emplace_back(mid);
push_heap(heap_big.begin(), heap_big.end(), [](int a, int b) {return b < a; });
heap_small.emplace_back(temp);
push_heap(heap_small.begin(),heap_small.end());
pop_heap(heap_small.begin(), heap_small.end());
mid = heap_small.back();
heap_small.pop_back();
}else if (heap_small.size() == heap_big.size() - ) {
//右侧比左侧多一个,将temp放入heap_small中,然后mid还是为中位数
heap_small.emplace_back(temp);
push_heap(heap_small.begin(), heap_small.end());
}else {
//左侧比右侧多一个的情况应该不会出现
cout << "wrong" << endl;
}
}
else {
if (heap_small.size() == heap_big.size()) {
//左侧和右侧一样大,将temp放入heap_big中,mid还是中位数
heap_big.emplace_back(temp);
push_heap(heap_big.begin(), heap_big.end(), [](int a, int b) {return b < a; });
}
else if (heap_small.size() == heap_big.size() - ) {
//右侧比左侧多一个,将mid放入heap_small中,然后将temp放入heap_big中,然后从heap_big选一个最小的作为mid
heap_small.emplace_back(mid);
push_heap(heap_small.begin(), heap_small.end());
heap_big.emplace_back(temp);
push_heap(heap_big.begin(), heap_big.end(), [](int a, int b) {return b < a; });
pop_heap(heap_big.begin(), heap_big.end(), [](int a, int b) {return b < a; });
mid = heap_big.back();
heap_big.pop_back();
}
else {
//左侧比右侧多一个的情况应该不会出现
cout << "wrong" << endl;
}
}
printf("%d ",mid);
}
return ;
}

问题 B: 非完美二叉树的高度与直径

时间限制: 2 Sec  内存限制: 3 MB
提交: 249  解决: 95
提交 状态 算法问答

题目描述

记T为一棵二叉树,树中共有n个节点。

定义根节点的深度为0,其余节点的深度为其父节点的深度加1。T的高度定义为其叶节点深度的最大值。

定义树中任意两点a和b之间的距离为其间最短简单路径的长度。T的直径定义为T中所有点对间距离的最大值。

输入一棵二叉树T,请计算它的高度和直径。

输入

输入共三行。

第一行输入n的值,表示树中结点的总个数。

第二行为树的前序遍历表示,每个节点之间用空格隔开。

第三行为树的中序遍历表示,每个节点之间也用空格隔开。

输出

输出共三行。
第一行需要大家输出一行字符串,它是“我已阅读关于抄袭的说明”的英文翻译,即:"I have read the rules about plagiarism punishment"。输出此行的提交我们将认为已经完全阅读并了解了“关于抄袭的说明”公告并同意关于抄袭的惩罚措施。
第二行输出树的高度。
第三行输出树的直径。

样例输入

10
0 1 9 3 8 4 2 7 5 6
3 9 8 1 2 4 0 5 7 6

样例输出

I have read the rules about plagiarism punishment
3
5

提示

分治算法可以在O(n)的时间内完成相应的计算。

答案

没法提交了,懒得写了,网上答案挺多的

南大算法设计与分析课程OJ答案代码(3)的更多相关文章

  1. 南大算法设计与分析课程OJ答案代码(5)--割点与桥和任务调度问题

    问题 A: 割点与桥 时间限制: 1 Sec  内存限制: 5 MB提交: 475  解决: 34提交 状态 算法问答 题目描述 给出一个无向连通图,找到所有的割点和桥 输入 第一行:点的个数,如果点 ...

  2. 南大算法设计与分析课程OJ答案代码(4)--变位词、三数之和

    问题 A: 变位词 时间限制: 2 Sec  内存限制: 10 MB提交: 322  解决: 59提交 状态 算法问答 题目描述 请大家在做oj题之前,仔细阅读关于抄袭的说明http://www.bi ...

  3. 南大算法设计与分析课程OJ答案代码(2)最大子序列和问题、所有的逆序对

    问题 A: 最大子序列和问题 时间限制: 1 Sec  内存限制: 4 MB提交: 184  解决: 66提交 状态 算法问答 题目描述 给定一整数序列 a1, a2, …, an,求 a1~an 的 ...

  4. 南大算法设计与分析课程OJ答案代码(1)中位数附近2k+1个数、任意两数之和是否等于给定数

    问题1 用来测试的,就不说了 问题2:中位数附近2k+1个数 给出一串整型数 a1,a2,...,an 以及一个较小的常数 k,找出这串数的中位数 m 和最接近 m 的小于等于 m 的 k 个数,以及 ...

  5. 南大算法设计与分析课程复习笔记(1) L1 - Model of computation

    一.计算模型 1.1 定义: 我们在思考和处理算法的时候是机器无关.实现语言无关的.所有的算法运行在一种“抽象的机器”之上,这就是计算模型. 1.2 种类 图灵机是最有名的计算模型,本课使用更简单更合 ...

  6. 南大算法设计与分析课程复习笔记(4)L4 - QuickSort

    一.快速排序 算法导论上关于快速排序有两种写法 第一种,从头到尾遍历,不断将小于基准元素的项移到前面.代码很简介,只需要维护一个交换位置,表示小于基准元素的末尾位置加一 我们看算法导论上的一个例子: ...

  7. 南大算法设计与分析课程复习笔记(3)L3 - Recursion

    一.递归方程 按照分治的思想,可以将一个递归的复杂度写成递归方程 一.解递归方程--猜然后证明 该方法又称为代入法,步骤如下: 1.猜解的形式 2.数学归纳法证明正确 例子: 我们假设有如下递归式: ...

  8. 南大算法设计与分析课程复习笔记(2)L2 - Asymptotics

    一.几种比较复杂度的符号 数据结构有描述,相关严格数学定义也不想说了,就这么过了吧. 二.最大子数组的几种解决方法 从最复杂的暴力解法过渡到最简单的动态规划 解析和代码见这里:http://www.c ...

  9. 算法设计与分析 - AC 题目 - 第 5 弹(重复第 2 弹)

    PTA-算法设计与分析-AC原题 - 最大子列和问题 (20分) 给定K个整数组成的序列{ N1, N2, ..., NK },“连续子列”被定义为{ Ni, Ni+, ..., Nj },其中 ≤i ...

随机推荐

  1. GitHub和Git(待补充)

    仓库(Repository):存放项目代码,每个项目对应一个仓库. 收藏(Star) 复制(Fork):克隆并生成新的仓库,from某某.以此为基础修改或应用项目.pull request,源仓库会查 ...

  2. Python之xml学习笔记

    XML处理模块 xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,至今很多传统公司如金融行业的很多系统的接口还主要是xml. xml的格式如下,就是通过&l ...

  3. 计算机网络六:无线局域网、IEEE 802.11、WIFI和蓝牙

    无线局域网.IEEE 802.11.WIFI和蓝牙 ㈠无线局域网 1.定义       无线局域网络(Wireless Local Area Networks),简称WLAN.它是相当便利的数据传输系 ...

  4. BAT:通过连接符处理判断OR的关系

    使用情况说明: 适用于对某个文件夹下不同的文件夹(名称)做不同的处理,但存在需要对其中多个文件夹(名称)进行相同处理的情况 例子中的目录结构: .\1.2.3 -- 文件夹.\a.b.c -- 文件夹 ...

  5. Apache启动不成功时,用命令行检测(新手)

    1,在配置Apache服务器时,经常要在httpd.conf 修改和添加一些代码,编写中,误写或者写错时,无法正常启动时,直接报错The requested operation has failed! ...

  6. FreeRTOS学习目录

    1.关于实时操作系统的一些概念性问题 2.freeRTOS与裸机程序相比有什么区别?? 3.freeRTOSConfig.h文件对FreeRTOS进行系统配置 4.FreeRTOS的内存管理

  7. Exp1 PC平台逆向破解----20164325 王晓蕊

    前言:实验中用到的知识 JE:条件转移指令,如果相等则跳转: JNE:条件转移指令(等同于“Jump Not Equal”),如果不相等则跳转: JMP:无条件跳转指令.无条件跳转指令可转到内存中任何 ...

  8. hadoop配置笔记

    接上回,hadoop的配置文件都在下载的压缩包目录中的etc/hadoop/中 hadoop-env.sh有个地方配置java_home 其他常用的设置文件有: core-site.xml yarn- ...

  9. 1.1.5 PROB Friday the Thirteenth

    Friday the Thirteenth Is Friday the 13th really an unusual event? That is, does the 13th of the mont ...

  10. H5的Web Audio Api

    概述 研究Web Audio Api的主要原因是:工作中需要在ios中实现声音的淡出效果,主要是通过setInterval来改audio标签的volume属性实现的,但是ios上面volume属性是只 ...