【排序】中山纪念中学暑期游Day13——rank

前言

题目描述有歧义,导致多名OIer暴零、英勇牺牲...

还好我赌对了哈哈哈哈哈...

题目

小h和小R正在看之前的期末&三校联考成绩,小R看完成绩之后很伤心,共有n(n<=5*10^6)个学生,第i个学生有一个总成绩Xi(0<=Xi<=10^5),因为他的排名是倒数第k(1<=k<=n)个,于是小R想知道那些成绩比他低(包括成绩和他一样)的同学的成绩,这样能让他没那么伤心。

Input

第一行,n和k,表示有n个学生,小R排倒数第k.
第二行,n个非负整数,表示这n个学生的成绩。

Output

一行,共k个数,从小到大输出。(相同成绩按不同排名算)

Sample Input

5 3
1 1 2 2 3

Sample Output

1 1 2

分析

题目意思就是按分数从低到高输出k个数即可

法一:桶排(很给力,我AC了)

法二:快排,一般打的sort(然而....“十年OI一场空,不打快读见祖宗”)

好像如果用sort,必须用快读,不然会被卡,玄学

考试时我旁边的兄弟看了题立马说:“这道题sort不行,卡sort”

我寻思这是怎么看出来的,n很大的原因吗,只能说66666...

代码

#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN=5e6,INF=0x3f3f3f3f;
int a[MAXN+5],vis[MAXN+5];
int n,k;
int Min=INF,Max=-INF;
int main()
{
	scanf("%d%d",&n,&k);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		Min=min(Min,a[i]);
		Max=max(Max,a[i]); 
		vis[a[i]]++;
	}
	int cnt=1;
	for(int i=Min;i<=Max;i++)
		while(cnt<=k&&vis[i])
		{
			vis[i]--;
			if(cnt==1)
				printf("%d",i);
			else
				printf(" %d",i);
			cnt++;
		}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值