前言
题目描述有歧义,导致多名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;
}