美文网首页
A1048 Find Coins (25分)

A1048 Find Coins (25分)

作者: km15 | 来源:发表于2020-01-31 10:56 被阅读0次

// 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;
}

相关文章

网友评论

      本文标题:A1048 Find Coins (25分)

      本文链接:https://www.haomeiwen.com/subject/ifgithtx.html