首页 > 其他分享 >Luogu P1923 求第 k 小的数

Luogu P1923 求第 k 小的数

时间:2024-01-25 22:01:15浏览次数:36  
标签:P1923 le findk int Luogu 样例 快排 数组

link

求第 k 小的数

题目描述

输入 \(n\)(\(1 \le n < 5000000\) 且 \(n\) 为奇数)个数字 \(a_i\)(\(1 \le a_i < {10}^9\)),输出这些数字的第 \(k\) 小的数。最小的数是第 \(0\) 小。

请尽量不要使用 nth_element 来写本题,因为本题的重点在于练习分治算法。

输入格式

输出格式

样例 #1

样例输入 #1

5 1
4 3 2 1 5

样例输出 #1

2

三个解法:

  • 先sort一遍数组,再找下标k的元素。(TLE警告)

  • 借用快排分治思想,将数组一分为二,找k在左边还是右边。

  • 在C++的库STL中,有一个神奇的函数nth_element,顾名思义,找到数组的第n大的数,具体用法详见OI-Wiki(个人推荐C++自学网站,内容齐全,教程详细,简单涉及Python)

这道题可以作为快排的模版题因为递归函数部分与快排几乎一毛一样。

#include<bits/stdc++.h>
using namespace std;
int n,k,ans;
int a[5000005];
void findk(int a[],int l,int r)
{
	if(l==r)
	{
		ans=a[l];
		return ;
	}
	int i=l,j=r,flag=a[(l+r)/2];
	do{
		while(a[i]<flag)
			i++;
		while(a[j]>flag)
			j--;
		if(i<=j)
		{
			swap(a[i],a[j]);
			i++,j--;
		}
	}while(i<=j);
	if(k<=j) findk(a,l,j);
	else if(k>=i) findk(a,i,r);
	else findk(a,j+1,i-1);
}
int main()
{
	ios::sync_with_stdio(false);
	cin>>n>>k;
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
	}
	findk(a,0,n-1);
	cout<<ans<<endl;
	return 0;
}

标签:P1923,le,findk,int,Luogu,样例,快排,数组
From: https://www.cnblogs.com/j1hx-oi/p/17988283

相关文章

  • Luogu P1249 最大乘积
    最大乘积题目描述一个正整数一般可以分为几个互不相同的自然数的和,如\(3=1+2\),\(4=1+3\),\(5=1+4=2+3\),\(6=1+5=2+4\)。现在你的任务是将指定的正整数\(n\)分解成若干个互不相同的自然数的和,且使这些自然数的乘积最大。输入格式只一个正整数\(n\),(\(3\leqn\leq10000\))。......
  • Luogu P1518 [USACO2.4] 两只塔姆沃斯牛
    [USACO2.4]两只塔姆沃斯牛TheTamworthTwo\(\color{cyan}link\)题目描述两只牛逃跑到了森林里。FarmerJohn开始用他的专家技术追捕这两头牛。你的任务是模拟他们的行为(牛和John)。追击在\(10\times10\)的平面网格内进行。一个格子可以是:一个障碍物,两头牛(它们总在一......
  • Luogu P4924 [1007] 魔法少女小Scarlet
    [1007]魔法少女小Scarlet\(\color{cyan}link\)题目描述Scarlet最近学会了一个数组魔法,她会在\(n\timesn\)二维数组上将一个奇数阶方阵按照顺时针或者逆时针旋转\(90^\circ\)。首先,Scarlet会把\(1\)到\(n^2\)的正整数按照从左往右,从上至下的顺序填入初始的二维数组......
  • Luogu P1563 [NOIP2016 提高组] 玩具谜题
    [NOIP2016提高组]玩具谜题\(link\)题目背景NOIP2016提高组D1T1题目描述小南有一套可爱的玩具小人,它们各有不同的职业。有一天,这些玩具小人把小南的眼镜藏了起来。小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的面朝圈外。如下图:这时singer告诉小南一个谜题:“......
  • Luogu P1042 [NOIP2003 普及组] 乒乓球
    [NOIP2003普及组]乒乓球\(link\)题目背景国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及。其中\(11\)分制改革引起了很大的争议,有一部分球员因为无法适应新规则只能选择退役。华华就是其中一位,他退役之后走上了乒乓球研究工作,意图......
  • 玩玩luogu算法题——第1期
    昨天已经把所有大作业写完了,所以今天就想去做一些有趣的事情...今天做的题都不是特别难,除了最后一题(写了大概1000多行Markdown,结果能Accepted的代码居然只有十几行?!)目标:希望暑假的时候每天都能更新一点算法题的随笔出来,加油~P1000超级玛丽游戏(一个非常入门的题目,作用是用来快速......
  • [Luogu] P1058 [NOIP2008 普及组] 立体图
    P1058[NOIP2008普及组]立体图模拟赛时候要是做出来这题就能拿饮料了:(题目传送门思路先打个输出长方体的函数:(其中\((x,y)\)表示该长方体的左上角)voiddraw(intx,inty){c[x][y+2]='+';c[x][y+6]='+';c[x+2][y]='+';c[x+2][y+4]='+';c[x+5][y]='+';c[x+5]......
  • 【洛谷 P1923】【深基9.例4】求第 k 小的数(快速排序)
    【深基9.例4】求第k小的数题目描述输入(且为奇数)个数字(),输出这些数字的第小的数。最小的数是第小。请尽量不要使用nth_element来写本题,因为本题的重点在于练习分治算法。输入格式输出格式样例#1样例输入#15143215样例输出#12思路先快速排序,然后通过数组索引访......
  • luogu1972题解
    还是先写被卡的做法吧。节点的区间用了现用现计算卡常过了。被卡了一上午,难过。话说有人说我码风有点抽象。思路主席树做法。a[i]是贝壳序列。先求出nxt,即与a[i]相同的下一个a[j]的下标j。用p114514[i]记了值为\(i\)的数的下标,循环到序列第\(j\)个数的时候,先......
  • luogu P9753题解
    题意描述有一个字符串,请你求出有多少个字串可以经过若干次,使它变成空串其中每次操作可以从字符串中删除两个相邻的相同字符,操作后剩余字符串会拼接在一起。##思路1可以枚举左端点,再枚举右端点,一边枚举一边判断是否合法时间复杂度$O(n^2)$空间复杂度$O(n)$##思......