问题1

用来测试的,就不说了

问题2:中位数附近2k+1个数

给出一串整型数 a1,a2,...,a以及一个较小的常数 k,找出这串数的中位数 和最接近 的小于等于 的 k 个数,以及最接近 的大于等于 的 k 个数。将这 2k+1 个数按升序排序后输出。

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

输入

第一行是 k 的值和数串的长度 n。

第二行是以空格隔开的 n 个整型数,最后一个数后面有空格。

输出

按升序排列的 2k+1 个数,以空格分开,最后一个数后面没有空格。结果可能出现重复的数。

思路

  这题如果直接排序再输出是会超时的,排序算法的复杂度为nlgn,后来按照快排的思想做通过了。

  先以快排的思想找出中位数,复杂度为n(递归方程为T(n)=T(n/2)+n,用代入法就可以证明),(由于快排是随机选取一个数做标准,所以我们在排完一次后需要判断所选标准和中位数的差距,接着在子区间内继续寻找中位数,选取到中位数后返回,具体看searchmid函数,应该写得很简洁了)

  按照快排的思想,我们已经将数组分为小于中位数的区间,中位数,大于中位数的区间。根据题目,所给的k很小,再根据选择排序的思想在左右两区间各选取k个数即可。

#include <iostream>
#include <vector>
#include <algorithm>
#include <limits.h>
using namespace std; //使用快速排序的思路,找出中间数,first和last为区间,pos为要寻找有序状态下的第几个数
int searchmid(vector<int>& v,int first, int last, int pos) {
int left = first;
int key = last;
for (int i = first; i <= last; ++i) {
if (v[i] < v[key]) {
swap(v[i], v[left]);
left++;
}
}
swap(v[left], v[key]);
if (left < pos)
return searchmid(v, left+, last, pos);
else if (left > pos)
return searchmid(v,first,left-,pos);
return left;
} int main()
{
int k,length;
cin >> k;
cin >> length;
vector<int> v(length,);
int pos = , num;
while (cin >> num) {
v[pos] = num;
pos++;
} /*int k = 0;
vector<int> v = {34, 10,9,8,7,6,5,4,3,2,1,0};
int length = v.size();*/ vector<int> result;
int index = searchmid(v, , length-, length/ - + length%);
//在数组前一部分寻找k个小于等于v[index]的数
for (int j = ; j < k; ++j) {
int max = INT_MIN;
int max_pos;
for (int i = ; i < index-j; ++i) {
if (v[i] > max) {
max = v[i];
max_pos = i;
}
}
swap(v[max_pos],v[index-j-]);
}
//在数组后一部分寻找k个大于等于v[index]的数
for (int j = ; j < k; ++j) {
int min = INT_MAX;
int min_pos;
for (int i = index + j + ; i < length; ++i) {
if (v[i] < min) {
min = v[i];
min_pos = i;
}
}
swap(v[min_pos],v[index+j+]);
}
for (int i = index - k; i <= index + k; i++) {
cout << v[i] ;
if (i != index + k)
cout << " ";
}
/*cout << endl; sort(v.begin(), v.end());
for (auto h : v)
cout << h << " ";
cout << endl; system("pause");*/
return ;
}

问题3:任意两数之和是否等于给定数

题目描述

给定一个 int 数组 arr,元素按照升序排列且各不相同。另外有一个目标数 c,请你找出 arr 中所有的数对 a, b,使得 a + b = c。

输入

输入为三行,第一行为 arr 的元素个数,第二行为 arr,元素以空格分隔,第三行为目标数 c。

输出

所有符合条件的数对 a, b。a 和 b 以空格分开,每个数对占据一行。每行中 a < b,所有数对以它的第一个数(也就是 a 的值)升序排列。

思路

直接遍历判断,符合条件的直接输出就可以了。

int main()
{
int length;
int target;
cin >> length;
vector<int> v(length, );
for (int i = ; i < length; ++i)
cin >> v[i];
cin >> target; for (int i = ; i < length;++i) {
for (int j = i + ; j < length; j++) {
if (v[i] + v[j] == target) {
cout << v[i];
cout << " ";
cout << v[j];
cout << endl;
}
}
} //system("pause");
return ;
}

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

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

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

  2. 南大算法设计与分析课程OJ答案代码(3)

    问题 A: 动态中位数问题 时间限制: 1 Sec  内存限制: 8 MB提交: 866  解决: 102提交 状态 算法问答 题目描述 输入一组整数a1, a2, …, an ,每输入一个整数,输出 ...

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

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

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

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

  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. java 保证程序安全退出

    以前在开发时只知道依靠数据库事务来保证程序关闭时数据的完整性. 但有些时候一个业务上要求的原子操作,不一定只包括数据库,比如外部接口或者消息队列.此时数据库事务就无能为力了. 这时我们可以依靠java ...

  2. eclipse里报:An internal error occurred during: "Building workspace". Java heap space(内存溢出)

    当在eclipse中的web工程中增加了extjs4,出现An internal error occurred during: "Building workspace".Java ...

  3. 吴恩达机器学习笔记49-主成分分析问题(Principal Component Analysis Problem Formulation)

    主成分分析(PCA)是最常见的降维算法. 在PCA 中,我们要做的是找到一个方向向量(Vector direction),当我们把所有的数据都投射到该向量上时,我们希望投射平均均方误差能尽可能地小.方 ...

  4. Python面向对象5:类的常用魔术方法

    魔术方法就是不需要人为调用的方法,基本是在特定的时刻自动触发- 魔术方法的统一的特征,方法名被前后各两个下滑线包裹 - 操作类 - `__init__`: 构造函数 - `__new__`: 对象实例 ...

  5. Kali学习笔记25:Arachni使用(实现分布式扫描)

    文章的格式也许不是很好看,也没有什么合理的顺序 完全是想到什么写一些什么,但各个方面都涵盖到了 能耐下心看的朋友欢迎一起学习,大牛和杠精们请绕道 Arachni不同于上次介绍的nikto和skipfi ...

  6. Kali学习笔记22:缓冲区溢出漏洞利用实验

    实验机器: Kali虚拟机一台(192.168.163.133) Windows XP虚拟机一台(192.168.163.130) 如何用Kali虚拟机一步一步“黑掉”这个windowsXP虚拟机呢? ...

  7. Spring Cloud Config采坑记

    1. Spring Cloud Config采坑记 1.1. 问题 在本地运行没问题,本地客户端服务能连上本地服务端服务,可一旦上线,发现本地连不上线上的服务 服务端添加security登录加密,客户 ...

  8. The SDK 'Microsoft.NET.Sdk' specified could not be found.

    有一台电脑用 VS Code 开发 .NET Core 项目时,每次打开文件夹都有一个错误(标题),定位在 C# 插件,鼠标放在代码上没有智能提醒,输入代码时没有补全提示,重装 VS Code 和所有 ...

  9. Python 函数中参数的分类及使用

    ######################非固定参数################## #第一种方式:def send_alert(msg,*users):##*users 是非固定参数,将传过来 ...

  10. Aseprite入门教程

    因为最近在学cocos2d-x和vs搭配做手机游戏开发,想自己做一些素材,所以找到了这款软件,Aseprite v1.1.12.刚安装上时也是不懂该怎么操作,随着逐渐地摸索,对初始的使用有了一些了解. ...