// A1048 Find Coins (25分).cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
考察:散列+是否存在一堆数字,左右的数字+中间特例的处理i == m - 1,并且hash【m - 1】<= 1
题意:
给出两个数字,一个是拥有的币,一个是必须还的钱(小于10的5次,小于10的3次)(B值不超过500)
要求在B中仅找到两个还了这笔钱
如果有多个方案,找V1最小那个
钱这么多,但是B值这么小,也就是有重复的B值咯,对果然,给出样例就有
解题:
1、把有的币值用hash
2、接下来如何判定能用两个还钱呢,一个大,一个小,两头遍历,也不是,找到第一个为真的,减去值,看看另一个为真吗,真就输出
3、判断失败呢,到了中间不行就是失败,但是怎么说呢,如果有两个B同时能还钱呢,比如10块钱,5跟5不就能还吗,如果可以,也就是中间这里必须大于两个了,那如何处理呢,中间是特判
learn && wrong;
1、if()里面的if,太好了+两个return
2、散列表不需要开10的5次,那么大,因为m的范围也就10的3次以内,所以最多也就10的3次的数字,但是也不能只开500,因为m-hash[i]绝对会超过,产生段错误
3、还的钱小于300,导致hashtable[i]值小于300,因为hashtable[i]表示出现次数
*/
#include <iostream>
using namespace std;
const int maxn = 1005;
int hash1[maxn] = { 0 };
int main()
{
int yongyou, qianqian;
cin >> yongyou >> qianqian;
for (int i = 0;i < yongyou;++i) { //有的钱
int temp;
cin >> temp;
++hash1[temp];
}
int i;
for (i = 0; i < maxn;++i) {
if (hash1[i] > 0 && hash1[qianqian - i] > 0) { //这是能成功的
int temp = qianqian - i;
if (i == temp && hash1[temp] <= 1){ //(!!!)学到了
continue;
}
cout << i << " " << temp << endl; //return也挺好的
return 0;
}
}
cout << "No Solution" << endl;
return 0;
}
网友评论