[PAT-A 1048]Find Coins

在这里插入图片描述
在这里插入图片描述
题目大意:
给出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;
}
发布了101 篇原创文章 · 获赞 1 · 访问量 2972

猜你喜欢

转载自blog.csdn.net/weixin_44699689/article/details/104199617