2414: 【普及/提高-】【P1923】求第 k 小的数
内存限制:128 MB
时间限制:1.000 S
评测方式:文本比较
命题人:
提交:28
解决:27
题目描述
输入 ( 且 为奇数)个数字 (),输出这些数字的第 小的数。最小的数是第 小。
请尽量不要使用 nth_element
来写本题,因为本题的重点在于练习分治算法。
样例输入 复制
5 1
4 3 2 1 5
样例输出 复制
2
提示

#include<bits/stdc++.h> using namespace std; int a[5000010],n; int ans=0,k;// 记录答案,以及求第k小。k是已知值,比如在main函数中赋值过 void findkth(int a[],int l,int r){ //引人数组的地址 if(l==r) { ans=a[l];// 区间长度为1时,记录答案 return; } int i = l, j = r, flag = a[(l + r) / 2], tmp; do { while (a[i]<flag)i++; //从左找比哨兵大的数 while (a[j]>flag)j--; //从右找比哨兵小的数 if (i<=j){ //交换 tmp=a[i];a[i]=a[j];a[j]=tmp; i++;j--; } } while (i <= j); if (k <= j)findkth(a,l,j); //第k小的数字在左区间 else if (i <= k)findkth(a,i,r); //第k小的数字在右区间 else findkth(a,j+1,i-1); //第k小的数字既不在左区间,也不在右区间 } int main(){ std::ios::sync_with_stdio(false); cin>>n>>k; for (int i=0;i<n;i++) cin>>a[i]; findkth(a,0,n-1); cout<<ans; return 0; }