hdu 1425 sort 解题报告

题目链接: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         

 

posted @ 2013-09-23 15:00  windysai  阅读(324)  评论(0编辑  收藏  举报