洛谷P1923 求第K小的数 研讨关于输入输出效率的问题(scanf and cin ,printf and cout)

最简单的思想就是将这n个数从小到大排序,然后直接输出下标为K的数,不用想肯定会超时,三个测试点过了,另外两个超时。
那么我想的就是,既然全排序会超时,有没有什么方法可以不用全排序也可以拿出第K小的数呢,我想到了堆这种数据结构,我们不用使用堆排序,而是将数组建堆,不断从堆中拿出当时最小的数,当取出第K个数时,那就是我们想要的第K小的数
代码如下(因为还不会STL,于是就手写建堆以及出堆)
#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
void swap(int* a, int* b)
{
int c = *a;
*a = *b;
*b = c;
}
void ShiftDown(int* Num, int Now, int Last)//一次向下调整
{
int Max = Now;
if (Now * 2 <= Last)
{
Max = Now * 2;
if (Now * 2 + 1 <= Last && Num[Now * 2 + 1] < Num[Max])
Max = Now * 2 + 1;
if (Num[Max] < Num[Now])
{
swap(Num + Now, Num + Max);
ShiftDown(Num, Max, Last);
}
}
}
int Pop(int* Num, int* Last)//出堆
{
int Temp = Num[1];
int Now = Num[*Last];
Num[1] = Now;
ShiftDown(Num, 1, *Last - 1);
(*Last)--;
return Temp;
}
int main()
{
int n, k;
cin >> n >> k;
int L = n;
int* Num = new int[n + 1];
for (int i = 1; i <= n; i++)
{
cin >> Num[i];
}
for (int i = n / 2; i >= 1; i--)
ShiftDown(Num, i, n);//调整建堆
int Temp;
for (int i = 1; i <= k + 1; i++)
Temp = Pop(Num, &n);
cout << Temp;
return 0;
}
但是不负众望,他还是TLE了,草泥马
然后,想起来输入输出也会影响,我就把C++的输入输出流cin和cout改为了C的标准输入输出scanf以及printf,然后就发生了神奇的现象,就改了输入输出,但是原先的代码AC了!!!呜呼呜呼
所以,在一些数据输入输出量很多的题里,如果TLE了可以尝试将cin和cout改为scanf以及printf!!!!而且听说getchar会更快
最后来说一下这道题的另一种做法,或者说题干推荐的做法?,分治或者说二分,利用快排的思想去找而不是进行整体的快速排序
#include<iostream>
#include<cstdio>
using namespace std;
void Swap(int* a, int* b)
{
int c = *a;
*a = *b;
*b = c;
}
int FindK(int* Num, int Begin, int Last, int k)
{
int Temp = Num[Begin];
int L = Begin; int R = Last;
while (L < R)
{
for (; Num[R] >= Temp && L < R; R--);
for (; Num[L] <= Temp && L < R; L++);
Swap(Num + R, Num + L);
}
Swap(Num + L, Num + Begin);//一次快排,所有比Temp小的都在Temp的左边,比Temp大的都在Temp右边
//而L(R)正好是比Temp小的元素个数,若K>L,则从L右边部分继续去找第K小,K<L,从右边找,K==L,说明找到了,输出
//所以只需要比较元素个数与K的大小就可以确定在那部分去寻找第K小的元素
if (k > L)
return FindK(Num, L + 1, Last, k);//去右边查找
else if (k < L)
return FindK(Num, Begin, L - 1, k);//去左边查找
else if (k == L)
return Num[k];//若正好,直接输出
}
int main()
{
int n, k;
scanf("%d %d", &n, &k);
int* Num = new int[n];
for (int i = 0; i < n; i++)
scanf("%d", Num + i);
printf("%d", FindK(Num, 0, n - 1, k));
return 0;
}
这样的话不需要去快排整个序列而是通过不断的二分查找去找部分的快排后的数据,来找第K小的数,比直接sort快多了,时间复杂度O(n),而快排时间复杂度O(nlogn)
洛谷P1923 求第K小的数 研讨关于输入输出效率的问题(scanf and cin ,printf and cout)的更多相关文章
- 求第k小的数
题目链接:第k个数 题意:求n个数中第k小的数 题解: //由快速排序算法演变而来的快速选择算法 #include<iostream> using namespace std; const ...
- *HDU2852 树状数组(求第K小的数)
KiKi's K-Number Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- [LeetCode] 4. Median of Two Sorted Arrays(想法题/求第k小的数)
传送门 Description There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the m ...
- 【题解】洛谷P1066 [NOIP2006TG] 2^k进制数(复杂高精+组合推导)
洛谷P1066:https://www.luogu.org/problemnew/show/P1066 思路 挺难的一道题 也很复杂 满足题目要求的种数是两类组合数之和 r的最多位数m为 w/k(当w ...
- 【洛谷p1066】2^k进制数
(不会敲键盘惹qwq) 2^k进制数[传送门] 算法标签: (又是一个提高+省选-的题) 如果我说我没听懂你信吗 代码qwq: #include<iostream> #include< ...
- 求第k小的数 O(n)复杂度
思路:利用快速排序的思想,把数组递归划分成两部分.设划分为x,数组左边是小于等于x,右边大于x.关键在于寻找一个最优的划分,经过 Blum . Floyd . Pratt . Rivest . Tar ...
- 基于快速排序思想partition查找第K大的数或者第K小的数。
快速排序 下面是之前实现过的快速排序的代码. function quickSort(a,left,right){ if(left==right)return; let key=partition(a, ...
- 【新知识】队列&bfs【洛谷p1996约瑟夫问题&洛谷p1451求细胞数量】
(是时候为五一培训准备真正的技术了qwq) part1 队列(FIFO) 算法简介: FIFO:First In First Out(先进先出) 队列是限定在一端进行插入,另一端进行删除的特殊线性表 ...
- 洛谷P2464 [SDOJ2008]郁闷的小J
洛谷P2464 [SDOJ2008]郁闷的小J 题目描述 小J是国家图书馆的一位图书管理员,他的工作是管理一个巨大的书架.虽然他很能吃苦耐劳,但是由于这个书架十分巨大,所以他的工作效率总是很低,以致他 ...
- 树状数组求第k小的元素
int find_kth(int k) { int ans = 0,cnt = 0; for (int i = 20;i >= 0;i--) //这里的20适当的取值,与MAX_VAL有关,一般 ...
随机推荐
- 秒杀活动java怎么实现
秒杀与其他业务最大的区别在于:秒杀的瞬间: (1)系统的并发量会非常的大 (2)并发量大的同时,网络的流量也会瞬间变大. 一个秒杀或者抢购页面,通常分为2个部分,一个是静态的HTML等内容,另一个就是 ...
- 基于阿里云Serverless函数计算开发的疫情数据统计推送机器人
一.Serverless函数计算 什么是Serverless? 在<Serverless Architectures>中对 Serverless 是这样子定义的: Serverless w ...
- 极速生成缩略图,Serverless 支撑赛事转播锁定冬奥亮点
作者 | 西流.筱姜 "北京冬奥会在开赛的第四天便成为了历史上收视最高的一届冬奥会,其转播内容总生产量将达 6000 小时,超过平昌冬奥会的 5400 小时.关注北京冬奥会的人群比往届都 ...
- Spring Boot Serverless 实战系列“部署篇” | Mall 应用
导读:SpringBoot 是基于 Java Spring 框架的套件,它预装了 Spring 的一系列组件,让开发者只需要很少的配置就可以创建独立运行的应用程序.在云原生的世界里,有大量的平台可以运 ...
- 机器学习-无监督机器学习-kmeans衍生的算法-18
目录 1. k-Medoids 2. 二分KMEANS 3. KMeans++ 4. elkan KMeans 5. min batch KMeans算法 6.小结: 1. k-Medoids 之前的 ...
- [Troubleshooting] kubectl cp exit code 255 - exec: \"tar\": executable file not found in $PATH"
0. 背景 kubectl cp container 文件到本地 host 报错: $ kubectl cp test/po-test-pod-0:/tmp ./ -c ctr-test-contai ...
- 【Freertos】任务切换分析
任务切换实现 xPortPendSVHandler: mrs r0, psp // 获取进入异常时的进程栈 isb ldr r3, =pxCurrentTCB // 加载线程控制块地址到r3 ldr ...
- 浪潮的CS5260F CS5260H CS5260Z
助力国产操作系统新生态!麒麟信安与东方通.浪潮.新华三.长城超云等多家生态伙伴完成产品兼容性认证 作者:湖南麒麟信安科技股份有限公司时间:2022-03-11 16:28:11 我要发布 关键词: 国 ...
- Loki动态展示linux本地日志
Loki动态展示linux本地日志 背景 产品需要拆分微服务部署,直接使用K8S部署虽然比较规范但是部署时间较长. 本地文件系统部署简洁快速一些, 但是不太好直接复用一些规范的产品. 本次处理方法就是 ...
- [译]深入了解现代web浏览器(二)
本文是根据Mariko Kosaka在谷歌开发者网站上的系列文章https://developer.chrome.com/blog/inside-browser-part2/ 翻译而来,共有四篇,该篇 ...