HDU 1425 sort
给你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
分析
数据较多的排序题目, 使用正常的方法会超时, 题目中有"各不相同"的条件, 因此可以采用数组储存输入的数据, 再从大到小输出数组的序号
ps: 数据从-500000开始, 因此将数组的每一位看做是-500000后的数字
代码
#include<stdio.h>
#include<string.h>
int a[1000010];
int main(void)
{
int n, m;
while(~scanf("%d %d", &n, &m))
{
int x, i;
memset(a, 0, sizeof(a));
while(n--)
{
scanf("%d", &x);
a[x+500000] ++;
}
for( i=1000000; m!=0; i--)
{
if( a[i]>0) //**
{
printf("%d", i-500000);
if( m>1)
{
printf(" ");
}
m --;
}
}
printf("\n");
}
return 0;
}
收获与反思
- 学会一种新的排序方式——即用数组下标作为数字, 用数组内的数字来标记是否储存
- 如果题目中没有各不相同的条件, 应该可以将代码中**位置的if条件改为for循环, 或者在if中再嵌套一个循环来实现
- 数组应该设置为全局变量, 如果设置为局部, 程序会爆掉