题目大意:
给出n个正整数和一个正整数m。问n个数字中是否存在一对数字a和b(a<=b)使得a+b=m成立。
如果有多对,输出a最小的那一对,如果没有,输出No Solution
思路1:Hash散列:
1)以int型HashTable[]数组存放每个数字出现的个数,其中HashTable[i]表示i出现的次数(1<=i<=1000)。
2)枚举1-1000中的每一个数字i,若i存在与数列,即HashTable[i]>0且m-i存在与数列即HashTable[m-i]>0,则找到了一对数,i,m-i,他们的和为m。
如果i==m-i时必须要保证i的个数要大于等于2,否则不行。
3)如果有多组答案,一定要输出最小的那一对。
AC代码:
//PAT_A 1048
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 1005;
int HashTable[maxn];
int main() {
int n, m, a;
(void)scanf("%d %d", &n, &m);
for (int i = 0; i < n; i++) {
(void)scanf("%d", &a);
HashTable[a]++;
}
for (int i = 1; i < n; i++) {//从最小的开始循环, 也保证了左右可能的结果中输出i最小的
if (HashTable[i] && HashTable[m - i]) {
if (i == m - i && HashTable[i] <= 1)continue;
printf("%d %d\n", i, m - i);
return 0;
}
}
printf("No Solution\n");
return 0;
}