输入一个长度为 nn 的整数数列,从小到大输出前 mm 小的数。
输入格式
第一行包含整数 nn 和 mm。
第二行包含 nn 个整数,表示整数数列。
输出格式
共一行,包含 mm 个整数,表示整数数列中前 mm 小的数。
数据范围
1≤m≤n≤1051≤m≤n≤105,
1≤数列中元素≤1091≤数列中元素≤109
输入样例:
5 3
4 5 1 3 2
输出样例:
1 2 3
1,代码
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
#define int long long
const int N = 1e5+1;
int a[N];
int Size=0;
void down(int k)
{
int t=k;
if(k*2<=Size&&a[k*2]<a[k])t=k*2;
if(k*2+1<=Size&&a[k*2+1]<a[t])t=k*2+1;
if(t-k)
{
swap(a[k],a[t]);
down(t);
}
}
signed main()
{
int n,m;
cin >> n>>m;
Size=n;
for (int i = 1; i <= n; i ++ )
{
cin >> a[i];
}
for (int i = n/2; i ; i -- )down(i);
for (int i = m; i ; i -- )
{
cout<<a[1]<<' ';
a[1]=a[Size];
Size--;
down(1);
}
}
2,堆是完全二叉树
a[1]
a[2] a[3]
a[4] a[5] a[6] a[7]
......
up();
down() ;