题目描述

给定 nnn 个正整数,请找出其中的第 kkk 小的数。

输入可能有重复数字,此时第kkk 小的值定义为唯一的 xxx,满足 公式
(∣{y∣y<x}∣<k)∧(∣{y∣y≥x}∣≥n−k)(| \lbrace y \mid y < x \rbrace | < k) \land (|\lbrace y \mid y \geq x\rbrace | \geq n - k)(∣{y∣y<x}∣<k)∧(∣{y∣y≥x}∣≥n−k),
也即将整个序列从小到大排序后的第 kkk 个数。

输入格式

由于输入可能很大,本题采用奇怪的方式读入。你可以直接使用这段代码完成读入。

请注意,输入存储在 a[1…n]a[1\dots n]a[1…n]里,000 不存内容。

其中,1≤k≤n≤4×107,0≤ai<2311 \leq k \leq n \leq 4\times 10 ^ 7, 0 \leq a_i < 2^{31}1≤k≤n≤4×107,0≤ai​<231 。

const int N = 4e7 + 1;
int n, k;
int a[N];
void read_input_data() {int m;cin >> n >> k >> m;for (int i = 1; i <= m; i++) {cin >> a[i];}unsigned int z = a[m];for (int i = m + 1; i <= n; i++) {z ^= z << 13;z ^= z >> 17;z ^= z << 5;a[i] = z & 0x7fffffff;}
}

输出格式

请输出到 stdout 中。

输出一行,包含一个整数,为你的答案。

样例输入

3 3 3
2 3 3
5 4 1
1919810

样例输出

3
737192472

数据范围

Time Limit: 1s

Memory Limit: 512MB

备注

第二组样例实际上代表的数是 [1919810,132030712,737192472,1757748577,642384501][1919810, 132030712, 737192472, 1757748577, 642384501][1919810,132030712,737192472,1757748577,642384501]。

输入格式解释:

输入第一行,三个正整数。输入第二行 mmm 个空格隔开的整数,表示 a1,…,ama_1, \dots , a_ma1​,…,am​。
am+1,…,ana_{m+1},\dots, a_nam+1​,…,an​使用 xorshift 随机生成器生成,
am+i=zimod231,\begin{aligned} a_{m + i} &= z_i \bmod 2 ^ {31}, \end{aligned} am+i​​=zi​mod231,​
其中,
z0=amxi=zi−1⊕(zi−1×213)(mod232)yi=xi⊕⌊xi217⌋(mod232)zi=yi−1⊕(yi−1×25)(mod232)\begin{aligned} z_0 &= a_m \\ x_i &= z_{i - 1}\oplus (z_{i -1} \times 2 ^ {13}) (\bmod 2^{32}) \\ y_i &= x_i \oplus \left \lfloor \frac {x_i} {2 ^ {17}}\right \rfloor (\bmod 2 ^ {32}) \\ z_i &= y_{i - 1}\oplus (y_{i -1} \times 2 ^ {5}) (\bmod 2^{32}) \end{aligned} z0​xi​yi​zi​​=am​=zi−1​⊕(zi−1​×213)(mod232)=xi​⊕⌊217xi​​⌋(mod232)=yi−1​⊕(yi−1​×25)(mod232)​

解决方案

#include <iostream>
using namespace std;const int N = 4e7 + 1;
int n, k;
int a[N];
void read_input_data() {int m;cin >> n >> k >> m;for (int i = 1; i <= m; i++) {cin >> a[i];}unsigned int z = a[m];for (int i = m + 1; i <= n; i++) {z ^= z << 13;z ^= z >> 17;z ^= z << 5;a[i] = z & 0x7fffffff;}
}
int median(int a[], int low, int high)
{int mid = (low+high)/2;if (a[low] < a[mid] && a[mid] < a[high]) return mid;else if (a[low] >= a[mid] && a[high] >= a[low]) return low;else return high;
}int divide(int a[], int low, int high)
{if (low >= high) return low;int index = median(a,low,high);int tmp = a[index];a[index] = a[low];a[low] = tmp;do {while (low < high && a[high] > tmp) --high;if (low < high) {a[low] = a[high];++low;}while (low < high && a[low] < tmp) ++low;if (low < high) {a[high] = a[low];--high;}} while (low != high);a[low] = tmp;return low;
}int quickSort(int a[], int low, int high, int k)
{int mid = divide(a,low,high);if (mid == k) return a[mid];else if (mid < k) return quickSort(a,mid+1,high, k);else return quickSort(a,low,mid-1, k);
}int main()
{read_input_data();cout << quickSort(a,1,n,k) << endl;return 0;
}

总结

本题用了快排的思想,若mid恰好等于k,那么结果就得到了。需要注意pivot的选取,用median可以保证不被一些数据集坑到。

声明

本人对代码保有版权,但是题目来自校内OJ平台,本人没有题目的版权。如有侵权,请联系本人删除。

算法设计与分析第一次作业 1300. k-th Smallest Number相关推荐

  1. 算法设计与分析第一次作业 1301. Bubbling Bubbles

    题目描述 给定一个长度为 nnn 的排列,元素标号为 1-n1 \dots n1-n. 如果对这个排列进行冒泡排序,那么每个元素会被交换若干次. 请输出每个元素在进行冒泡排序时,参与了多少次交换. 我 ...

  2. 哈工大2020秋算法设计与分析大作业(一)

    哈工大2020秋算法设计与分析大作业(一) 前言 正文 1 论文题目 标题 作者 刊物 2 论文阅读报告 2.1 摘要 2.2 问题定义 2.3 算法或证明过程 2.4 实验结论 哈工大2020秋算法 ...

  3. 算法设计与分析大作业 关于核算检测次数的问题研究 (分治策略 二分法 实例生活运用)

    一.问题描述 如今疫情一直困扰着大家的正常生活,迟迟不见好转,反而这几天更是严重,直接变成了三天两检的全员核酸检测.其实,由于数量的原因,核酸检测是很烧钱的,一个核酸检测试剂盒(荧光PCR法)就要5元 ...

  4. Contest3032 - 计科2101~2104算法设计与分析上机作业03

    目录 问题 A: 质数 问题 B: 分治法求解全排列问题 问题 C: 数的计数 问题 D: 最大公共子序列问题 问题 E: 分解式的个数 问题 F: 矩阵最优连乘问题 问题 A: 质数 题目描述 判断 ...

  5. 【动态规划】机器人路径规划——算法设计与分析慕课作业

    题目内容: 一个机器人只能向下和向右移动,每次只能移动一步,设计一个算法求机器人从(1,1)到(m,n)有多少条路径. 输入格式: 以空格分开m,n 输出格式: 路径条数 输入样例: 4 5 输出样例 ...

  6. 【动态规划】拦截导弹问题——算法设计与分析慕课作业

    题目内容: 某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导 ...

  7. 天津理工大学研究生学位课《算法设计与分析》期末大作业

    2022- 2023学年度第一学期 研究生学位课< 算法设计与分析 > 期末大作业 2022级电子信息天理研究生 一.简答题 1.若,写出用Θ.Ω和О描述f(n) 的渐进表达.(7分) 答 ...

  8. PHP第五周答案,算法设计与分析第五周作业——Word Ladder

    算法设计与分析第五周作业--Word Ladder 上周找了一道深度搜索优先搜索的算法题来做,于是这周就选了一道广度优先搜索算法题来试试手. 本周所选题目:原题目链接 题目详情 题目大意:给出一个字符 ...

  9. java实现 库鲁斯卡尔算法 kruskal(算法设计与分析作业)

    java实现 库鲁斯卡尔算法kruskal(算法设计与分析作业) package package1;import java.util.Arrays;public class alg {//判断tar是 ...

最新文章

  1. 听说你是参加智能车比赛的?
  2. 西安python培训班多少钱-西安python培训多少钱?
  3. C++中多态与虚函数的学习例子
  4. 2018明星学术公众号TOP 10重磅发布,PaperWeekly再度入选
  5. FastAdmin 极速后台管理框架(三周年)V1.0.0.20190410_beta
  6. PS制作棱镜化多边形照片效果
  7. 计算机网络拓扑分层,计算机网络和工程实践教程讲座主讲内容网络拓扑和分层体系结构.ppt...
  8. iOS 让UIButton根据文字内容自动计算宽高
  9. 小A是支枪,子弹未打光---之手 枪篇
  10. 47-高级路由:BGP 镜子实验
  11. dirver时区_MySQL JDBC驱动程序5.1.33-时区问题
  12. AT指令集及其通信测试方式
  13. 推动区块链基础设施建设,先要破解区块链发展“三高”难题
  14. 前端开发IDE---VSCode前端开发环境配置
  15. java翻译smali_【翻译】apk反汇编之smali语法
  16. 移动硬盘根目录里的msdia80.dll文件
  17. 2. Instructions: Language of the computer
  18. Android开发学习——2.Android开发环境准备
  19. 20230316 作业
  20. (与运算)、|(或运算)、^(异或运算)等运算符的解释与运用

热门文章

  1. 安装nodejs和npm以后出现 /usr/bin/env: node: No such file or directory
  2. vue element 控件之 el-container中的el-side 与 el-main 的间距怎么设置
  3. 本篇讲述详解windows XP系统内核文件的文章主题
  4. HTML5期末大作业 用HTML+CSS+JS制作婚庆网页【大学生网页作业代码】
  5. easyUI dataGrid 隐藏分页工具栏 隐藏表头
  6. Ghostxpsp3电脑爱好者纯净版V9.9
  7. java 和grails_java – Grails值得吗?
  8. 对微分和导数的区别理解
  9. Taro框架中 Image 和 Video 组件预览图片/视频时添加明显的关闭按钮以关闭全屏预览
  10. ae预览不了多次_AECC预览视频一半就重新开始?AECC预 – 手机爱问