问题描述
CQNK中学高一年级总共有n(n<=500000)个学生。现在你有他们的“星际语”成绩单,要从中找出“星际语”成绩最好的m(m<=1000并且m小于n)个学生组成宇宙班,请按由高到低的顺序打印出加入宇宙班学生的“星际语”成绩。
输入格式
第一行,两个整数n和m
第二行,n个用空格间隔的整数,分别表示n个学生的“星际语”成绩(分数在INT范围以内)
输出格式
只有一行,m个空格间隔的整数,表示加入宇宙班学生的“星际语”成绩。
样例输入
12 5
89 87 77 95 68 56 100 80 65 95 99 71
样例输出
100 99 95 95 89
#include<bits/stdc++.h>
#define maxn 500001
using namespace std;
int heap[maxn],n,m;
void shift(int i,int len)
{
int t=heap[i],k=2*i;
while(k<=len)
{
if((k<len)&&(heap[k]<heap[k+1]))k++;
if(t<heap[k]){heap[i]=heap[k];i=k;k=2*i;
}
else break;
}
heap[i]=t;
}
int main()
{
int i;
cin>>n>>m;
for(i=1;i<=n;i++)cin>>heap[i];
for(i=n/2;i>=1;i--)shift(i,n);
for(i=1;i<=m;i++)
{
cout<<heap[1]<<" ";
heap[1]=heap[n];
n--;
shift(1,n);
}
return 0;
}