qduoj GZS送温暖

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
数据很水,sort就能过

#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;
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值