HDU 1280 前m大的数给定的N个整数序列, 两两求和,从大到小输出M个和数。
因为所有整数不超过5000,则相加不会超过10000,可以
用哈希解决。
1 // 简单哈希
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <string.h>
5 #include <algorithm>
6 using namespace std;
7
8 const int maxn = 3005;
9 int arr[maxn], sum[10001] ,n, m, x, y;
10 //因为所有的整数都不超过5000, 所以最大的和也不超过10000, sum数组开10001即可!
11
12 int main()
13 {
14 while (scanf("%d %d", &n, &m) != EOF)
15 {
16 arr[n];
17 for (int i=0; i<n; i++)
18 {
19 scanf("%d", &arr[i]);
20 }
21 memset(sum, 0, sizeof(sum));
22 for (int i=0; i<n-1; i++)
23 {
24 for (int j=i+1; j<n; j++)
25 {
26 sum[arr[i] + arr[j]] ++;
27 }
28 }
29 int count = 0;
30 for (int j=10000; j>=0; j--)
31 {
32 if (sum[j])
33 {
34 for (int i=0; i<sum[j]; i++)
35 {
36 count++;
37 count == 1 ? printf("%d", j) : printf("%d", j);
38 if (count == m)break;
39 printf(" ");
40 }
41 }
42 if (count == m) break;
43 }
44 printf("\n");
45 }
46 }
47