我的第一篇博客,主要是分享我的一道做题经历,是洛谷的P1923.
已经写在我洛谷的博客上啦,希望大家能够多多支持。文章列表 - JunhanWang 的博客 - 洛谷博客
题目传送门:【深基9.例4】求第 k 小的数 - 洛谷
直接上题解:
我承认我很弱——用了sort和nth_element还是过不了
下面请大家欣赏——sort错误做法
#include<bits/stdc++.h>
using namespace std;
long long k,a[100000000],n;
int main()
{
cin>>n>>k;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
sort(a,a+n);
cout<<a[k];
}
只得了60分
然后,本弱鸡有用了题目大忌——nth_element
然而并没有什么用,还是上一下代码吧 60pts
#include<bits/stdc++.h>
using namespace std;
long long k,a[100000000],n;
int main()
{
cin>>n>>k;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
nth_element(a,a+k,a+n);
cout<<a[k];
}
我才发现,T的原因是——没用scanf 就发一个nth_element版
#include<bits/stdc++.h>
using namespace std;
long long k,a[5000005],n;
int main()
{
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
nth_element(a,a+k,a+n);
printf("%d",a[k]);
}
终于对了
但是,还是要发一下正解的。下面请大家欣赏我的代码
我华丽的二分
#include<bits/stdc++.h>
using namespace std;
int x[5000005],k;
void qsort(int l,int r)
{
int i=l,j=r,mid=x[(l+r)/2];
do
{
while(x[j]>mid)
j--;
while(x[i]<mid)
i++;
if(i<=j)
{
swap(x[i],x[j]);
i++;
j--;
}
}while(i<=j);
if(k<=j)
qsort(l,j);
else if(i<=k)
qsort(i,r)
else
{
printf("%d",x[j+1]);
}
}
int main()
{
int n;
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++)
scanf("%d",&x[i]);
qsort(0,n-1);
}
那么这道题就华丽的结束了,下课
希望大家可以在1029取得好成绩(其实我也要考)