Description
给你n个整数,请按从大到小的顺序输出其中前m大的数。
Input
每组测试数据有两行,第一行有两个数n,m(0<n,m<1000000),第二行包含n个各不相同,
且都处于区间[-500000,500000]的整数。
Output
对每组测试数据按从大到小的顺序输出前m大的数。
Sample Input
5 3 3 -35 92 213 -644
Sample Output
213 92 3题目描述很简单,但是容易超时,很多方法可以做,这里我尝试了一下计数排序,占用了很多内存,但是时间是我试了几种方法里最少的。#include<stdio.h> #include<algorithm> #include<string.h> int a[500000]; int b[500000]; int c[10]; int d[1000000]; int main() { int n,m; while(scanf("%d%d",&n,&m)!=EOF) { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); int i,tem,j,k=0,f=0; for(i=0;i<n;i++) { scanf("%d",&tem); if(tem>0) a[tem]++; else if(tem==0) c[tem]++; else if(tem<0) b[-tem]++;} for(i=500000;i>0;i--) if(a[i]!=0 ) for(j=0;j<a[i];a[i]--) d[k++]=i; for(i=0;i<10;i++) if(c[i]!=0) for(j=0;j<c[i];c[i]--) d[k++]=i; for(i=1;i<500000;i++) if(b[i]!=0 ) for(j=0;j<b[i];b[i]--) d[k++]=0-i; for(i=0;i<m;i++) { if(f) printf(" "); printf("%d",d[i]);f=1;}printf("\n"); } }
计数排序原理很简单,开一个很大的数组都赋值为0,当遇到一个数,比喻100,就在a[100]++,说明100出现,然后在一次for循环输出即可。