GZS送温暖
发布时间: 2015年9月6日 15:18 最后更新: 2016年6月30日 21:54 时间限制: 1000ms 内存限制: 256M
众所周知,GZS是一个总是考第一的大学霸,为什么呢?因为GZS喜欢思考!(逃…
当然,GZS也有不愿意动脑的时候,给你N个正整数(可以重复),GZS希望让你告诉他这些正整数里面第K小的数是多少。简单吗,ACCEPT it!
第一行为一个整数N ( N <= 100000) 代表整数个数; 第二行为N个整数,并且每个正整数的值都不大于10^6; 第三行为一个整数K ( K <= N );
输出一行,包含一个整数。这个整数就是这个序列里面排第K小的数。
复制
5 1 2 2 4 5 3
2
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
int cmp(int u,int v)
{
return u<v;
}
int main()
{
int n,k,a[100005];
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
scanf("%d",&k);
sort(a,a+n,cmp);
printf("%d\n",a[k-1]);
return 0;
}
其实还有一种最优解,优先队列来做
(。。当时还不会用c_库函数,手写一个简单的优先队列)
#include<stdio.h>
void weihu(int n[100005],int le,int ri);
int main()
{
int n,k,a[100005],que[100005];
int head=0,tail=0,flog=0;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
scanf("%d",&k);
for(int i=0;i<n;i++)
{
if(tail<k)
que[tail++]=a[i];
else
{
if(flog==0)
{
weihu(que,head,tail);
flog=1;
}
if(a[i]<que[head])
{
head++;
que[tail++]=a[i];
weihu(que,head,tail);
}
}
}
printf("%d\n",que[head]);
return 0;
}
void weihu(int n[100005],int le,int ri)
{
int max=le,t;
for(int i=le;i<ri;i++)
{
if(n[i]>n[max])
max=i;
}
t=n[max];
n[max]=n[le];
n[le]=t;
return;
}