题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1425
常规的方法是对输入的数从大到小进行排序(可以用sort或qsort),然后输出前m大的数。
不过此题实质上是hash的入门题。建立一个比较大的数组,然后把这些数通过hash函数计算映射到这个数组里面(这里hash函数是 tmp + 500000,tmp是输入的n个数中任意的一个数),考虑到这些数是各不相同的,因此不需要考虑冲突问题。
1 #include <iostream> 2 #include <string.h> 3 using namespace std; 4 5 const int maxn = 1e6 + 5; 6 int hash[maxn]; // 因为数据范围是-500000~500000,因此1e6的大小即能够存储所有的数 7 8 int main() 9 { 10 int i, n, m, tmp; 11 while (scanf("%d%d", &n, &m) != EOF) 12 { 13 memset(hash, 0, sizeof(hash)); 14 for (i = 0; i < n; i++) 15 { 16 scanf("%d", &tmp); 17 hash[tmp+500000] = 1; // 把该数映射去hash数组里之后要做标记,为下面的查找做准备 18 } 19 for (i = maxn-5; i >= 0; i--) 20 { 21 if (hash[i]) 22 { 23 m--; 24 if (m) 25 printf("%d ", i-500000); 26 else 27 { 28 printf("%d\n", i-500000); // 一旦前m个数全部输出来之后,就退出循环 29 break; 30 } 31 } 32 } 33 } 34 return 0; 35 } 36 37