比赛 2026初中综合小练习 评测结果 AAAAA
题目名称 求集合中最小的N个数 最终得分 100
用户昵称 PigFlies 运行时间 0.261 s
代码语言 C++ 内存使用 4.77 MiB
提交时间 2026-04-14 20:18:08
显示代码纯文本
#include <iostream>
using namespace std;
int a[2000000];
int n,ans=0,now=2,t,last=0;
void swim(int k)
{
    while(k>1&&a[k]<a[k/2])
    {
        swap(a[k],a[k/2]);
        k/=2;
    }
}
void sink(int k)
{
    while(2*k<now)
    {
        int j=2*k;
        if(j+1<now&&a[j]>a[j+1])++j;
        if(a[k]<a[j])return;
        swap(a[k],a[j]);
        k=j;
    }
}
int main()
{
    freopen("minvalinset.in","r",stdin);
    freopen("minvalinset.out","w",stdout);
    scanf("%d",&n);
    a[1]=1;
    while(ans<n)
    {
        if(a[1]>last)
        {
            printf("%d ",a[1]);
            ++ans;
            last=a[1];
        }
        t=a[1];
        if(t>1073741820)
        {
            a[1]=a[--now];
            sink(1);
            continue;
        }
        a[1]=2*t+1;
        sink(1);
        if(t>715827880)continue;
        a[now]=3*t+1;
        swim(now++);
    }
    return 0;
}