• 【堆排 && 思路】数据结构实验之排序四:寻找大富翁


    一个看似很水但很坑的题:数据结构实验之排序四:寻找大富翁
    这题时间压的很短只有200ms,用平常的堆排序。直接T,别问我怎么知道(心累啊),要不也不会写这篇博客。直接上代码。这题关键在于用了一个很巧妙的思想,没有去对所有1e6的数据全部堆排,而转去维护了m个小顶堆,这样效率大大提高。最终能维护成一个m个最大元素组成的小顶堆。最终输出就好了。(*注:记得维护的是小顶堆而输出要从大到小。所以还要进行一个简单的排序。)

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #define N 100005
    long long int a[N];
    int size;
    
    void Insert(long long int m)
    {
        a[++size] = m;
        int i;
        for(i = size; i != 0; i /= 2)
        {
            if(a[i] < a[i/2])
            {
                long long int t = a[i];
                a[i] = a[i/2];
                a[i/2] = t;
            }
            else
                break;
        }
    }
    
    void Adjustment()
    {
        int i, x;
        for(i = 1; 2 * i <= size; i = x)
        {
            if(2 * i + 1 <= size && a[i * 2] > a[i * 2 + 1])
                x = i * 2 + 1;
            else
                x = i * 2;
            if(a[i] > a[x])
            {
                long long int t = a[i];
                a[i] = a[x];
                a[x] = t;
            }
            else
                break;
        }
    }
    
    int main()
    {
        int n, i, m;
        scanf("%d%d", &n, &m);
        for(i = 0; i < m; i++)//创建小顶堆
        {
            int x;
            scanf("%d", &x);
            Insert(x);
        }
        for(i = m;i < n; i++)//维护小顶堆
        {
            int x;
            scanf("%d", &x);
            if(x > a[1])
            {
                a[1] = x;
                Adjustment();
            }
        }
        for(i = m;i > 0; i--)//再做一个排序
        {
            int t = a[1];
            a[1] = a[i];
            a[i] = t;
            size--;
            Adjustment();
        }
        for(i = 1;i <= m; i++)
        {
            if(i == m)
                printf("%lld
    ", a[i]);
            else
                printf("%lld ", a[i]);
        }
        return 0;
    }
    
  • 相关阅读:
    WPS 模拟手写签名
    Flask 正则匹配路由、异常
    FLASK 加载配置、简单传参调用、指定请求方式、返回json、网页跳转(也可以自己的视图函数)、自定义状态码
    python IDLE 自动提示功能
    PYQT设计无边框窗体
    PYQT窗口居中
    PYQT窗口托盘目录
    PYQT窗口风格
    PYQT窗口可视化编程
    PYQT控件使用
  • 原文地址:https://www.cnblogs.com/zyysyang/p/11093503.html
Copyright © 2020-2023  润新知