SDUT 3401 数据结构实验之排序四:寻找大富翁

数据结构实验之排序四:寻找大富翁

Time Limit: 200 ms Memory Limit: 512 KiB

Problem Description

2015胡润全球财富榜调查显示,个人资产在1000万以上的高净值人群达到200万人,假设给出N个人的个人资产值,请你快速找出排前M位的大富翁。

Input

首先输入两个正整数N( N ≤ 10^6)和M(M ≤ 10),其中N为总人数,M为需要找出的大富翁数目,接下来给出N个人的个人资产,以万元为单位,个人资产数字为正整数,数字间以空格分隔。

Output

一行数据,按降序输出资产排前M位的大富翁的个人资产值,数字间以空格分隔,行末不得有多余空格。

Sample Input

6 3
12 6 56 23 188 60

Sample Output

188 60 56

提示:本题要求用堆排来解决,堆排需要建大堆和小堆。堆排的时间复杂度是O(nlogn)

代码实现如下(gcc):
#include <stdio.h>
int a[20];
int m;

void Swap(int x,int y)//交换顺序
{
    int t;
    t=a[x];
    a[x]=a[y];
    a[y]=t;
}

void Siftdown(int i)//向下找
{
    int t,flag=0;//t用来记录较小结点,flag来判断能否向下调整
    while(i*2<=m&&flag==0)
    {
        if(a[i]>a[i*2])
            t=i*2;
        else
            t=i;
        if(i*2+1<=m)
        {
            if(a[t]>a[i*2+1])
                t=i*2+1;
        }
        if(t!=i)
        {
            Swap(t,i);//交换
            i=t;//向下更新
        }
        else
            flag=1;//否则不能调整了
    }
}

void heapsort()//堆排序
{
    while(m>1)
    {
        Swap(m,1);
        m--;
        Siftdown(m);
    }
}

int main()
{
    int num,n,i,j;
    scanf("%d %d",&num,&m);
    for(i=1;i<=m;i++)
    {
        scanf("%d",&a[i]);
    }
    n=m;
    for(i=m/2;i>=1;i--)
    {
        Siftdown(i);
    }
    for(i=m+1;i<=num;i++)
    {
        int x;
        scanf("%d",&x);
        if(x>a[1])
        {
            a[1]=x;
            for(j=m/2;j>=1;j--)
            {
                Siftdown(j);
            }
        }
    }
    heapsort();
    for(i=1;i<=n;i++)
    {
        i<n? printf("%d ",a[i]):printf("%d\n",a[i]);
    }
    return 0;
}

/***************************************************
Result: Accepted
Take time: 196ms
Take Memory: 156KB
****************************************************/

原文地址:https://www.cnblogs.com/jkxsz2333/p/9513556.html

时间: 2024-10-06 04:46:00

SDUT 3401 数据结构实验之排序四:寻找大富翁的相关文章

SDUT 3361 数据结构实验之图论四:迷宫探索

数据结构实验之图论四:迷宫探索 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Description 有一个地下迷宫,它的通道都是直的,而通道所有交叉点(包括通道的端点)上都有一盏灯和一个开关:请问如何从某个起点开始在迷宫中点亮所有的灯并回到起点? Input 连续T组数据输入,每组数据第一行给出三个正整数,分别表示地下迷宫的结点数N(1 < N <= 1000).边数M(M <= 30

SDUT 3343 数据结构实验之二叉树四:还原二叉树

数据结构实验之二叉树四:还原二叉树 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度. Input 输入数据有多组,每组数据第一行输入1个正整数N(1 <= N <= 50)为树中结点总数,随后2行先后给出先序和中序遍历序列,均是长度为N的不包含重复英文字母(区分大小写)的字符串. Output 输出一个整数,即该二叉树的

SDUT 3404 数据结构实验之排序七:选课名单.!?

数据结构实验之排序七:选课名单 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 随着学校规模的扩大,学生人数急剧增加,选课名单的输出也成为一个繁重的任务,我校目前有在校生3万多名,两千多门课程,请根据给定的学生选课清单输出每门课的选课学生名单. Input 输入第一行给出两个正整数N( N ≤ 35000)和M(M ≤ 2000),其中N是全校学生总数,M是课程总数,随后给出N行,每行包括

SDUT 3376 数据结构实验之查找四:二分查找

数据结构实验之查找四:二分查找 Time Limit: 20MS Memory Limit: 65536KB Submit Statistic Problem Description 在一个给定的无重复元素的递增序列里,查找与给定关键字相同的元素,若存在则输出找到的位置,不存在输出-1. Input 一组输入数据,输入数据第一行首先输入两个正整数n ( n < = 10^6 )和m ( m < = 10^4 ),n是数组中数据元素个数,随后连续输入n个正整数,输入的数据保证数列递增.随后m行输

SDUT 3403 数据结构实验之排序六:希尔排序

数据结构实验之排序六:希尔排序 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 我们已经学习了各种排序方法,知道在不同的情况下要选择不同的排序算法,以期达到最好的排序效率:对于待排序数据来说,若数据基本有序且记录较少时, 直接插入排序的效率是非常好的,希尔排序就是针对一组基本有序的少量数据记录进行排序的高效算法.你的任务是对于给定的数据进行希尔排序,其中增量dk=n/(2^k)(k=1,2

SDUT 3399 数据结构实验之排序二:交换排序

数据结构实验之排序二:交换排序 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 冒泡排序和快速排序都是基于"交换"进行的排序方法,你的任务是对题目给定的N个(长整型范围内的)整数从小到大排序,输出用冒泡和快排对这N个数排序分别需要进行的数据交换次数. Input 连续多组输入数据,每组数据第一行给出正整数N(N ≤ 10^5),随后给出N个整数,数字间以空格分隔. Output

SDUT 3398 数据结构实验之排序一:一趟快排

数据结构实验之排序一:一趟快排 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 给定N个长整型范围内的整数,要求输出以给定数据中第一个数为枢轴进行一趟快速排序之后的结果. Input 连续输入多组数据,每组输入数据第一行给出正整数N(N < = 10^5),随后给出N个长整型范围内的整数,数字间以空格分隔. Output 输出一趟快速排序后的结果,数字间以一个空格间隔,行末不得有多余空格.

SDUT OJ 数据结构实验之栈四:括号匹配

#include<iostream> #include<stdio.h> using namespace std; int main() { char a[51],b[51]; int i,top; while(gets(a)!=NULL) { top=-1; for(i=0;a[i]!='\0';i++) { if(a[i]=='{'||a[i]=='['||a[i]=='(') { b[++top]=a[i]; } else if(a[i]=='}') { if(b[top]=

数据结构实验之链表四:有序链表的归并

数据结构实验之链表四:有序链表的归并 Time Limit: 1000MS Memory limit: 65536K 题目描述 分别输入两个有序的整数序列(分别包含M和N个数据),建立两个有序的单链表,将这两个有序单链表合并成为一个大的有序单链表,并依次输出合并后的单链表数据. 输入 第一行输入M与N的值: 第二行依次输入M个有序的整数: 第三行依次输入N个有序的整数. 输出 输出合并后的单链表所包含的M+N个有序的整数. 示例输入 6 5 1 23 26 45 66 99 14 21 28 5