杭电 1425 sort 题解报告

来源:互联网 发布:网络品牌商城 编辑:程序博客网 时间:2024/05/21 08:47
Problem Description
给你n个整数,请按从大到小的顺序输出其中前m大的数。
Input
每组测试数据有两行,第一行有两个数n,m(0<n,m<1000000),第二行包含n个各不相同,且都处于区间[-500000,500000]的整数。
Output
对每组测试数据按从大到小的顺序输出前m大的数。
Sample Input
5 33 -35 92 213 -644
Sample Output
213 92 3算法:
这种题都是有暴力算法的,但是暴力算法慢而且占用内存大,显然不可取
这里用的算法是“桶排序”法。
第一步,定义一堆桶,要足够多,类型可以用int,但我用的是bool,这样可以节省大量内存;
第二步,初始化桶,就是把桶倒干净;
第三步,向桶里装入与桶编号相同的数,空桶为0,不空为1;
第四步,按要求输出。
#include <iostream>#include <cstdio>using namespace std;#define N 1000001bool a[N];//布尔变量组存0或1,比其他类型占空间小int main(){    int n,m,i,x,k;    while(scanf("%d%d",&n,&m)!=EOF)    {        memset(a,false,sizeof(a));//将a中所有字节用false(0)替换并返回a,将桶倒空。        for(i=0;i<n;i++)        {            scanf("%d",&x);            a[x+500000]=true;//500000为中间值,将满足条件的桶装入//前面的装负数后面的装正数        }        k=0;        for(i=N-1;i>=0;i--)        {            if(k==m)//m为限制个数(题目要求的)                break;            if(a[i])//桶不空            {                if(k)//限制不到                    printf (" ");                k++;                printf("%d", i-500000);//输出桶编号,前面加了这里就减去            }        }        printf("\n");    }    return 0;}

0 0
原创粉丝点击