首页 > 代码库 > 1048. Find Coins (25)

1048. Find Coins (25)

题目例如以下:

Eva loves to collect coins from all over the universe, including some other planets like Mars. One day she visited a universal shopping mall which could accept all kinds of coins as payments. However, there was a special requirement of the payment: for each bill, she could only use exactly two coins to pay the exact amount. Since she has as many as 105 coins with her, she definitely needs your help. You are supposed to tell her, for any given amount of money, whether or not she can find two coins to pay for it.

Input Specification:

Each input file contains one test case. For each case, the first line contains 2 positive numbers: N (<=105, the total number of coins) and M(<=103, the amount of money Eva has to pay). The second line contains N face values of the coins, which are all positive numbers no more than 500. All the numbers in a line are separated by a space.

Output Specification:

For each test case, print in one line the two face values V1 and V2 (separated by a space) such that V1 + V2 = M and V1 <= V2. If such a solution is not unique, output the one with the smallest V1. If there is no solution, output "No Solution" instead.

Sample Input 1:
8 15
1 2 8 7 2 4 11 15
Sample Output 1:
4 11
Sample Input 2:
7 14
1 8 7 2 4 11 15
Sample Output 2:
No Solution


这道题目要求从线性表中找出两个元素,使得他们的和为要求的值。假设有多组满足的,输出最小的一组,而且这两个元素依照从小到大的顺序输出。

题目限定的时间为50ms。说明必须採用一个非O(N^2)的算法,也就是不能从前到后,从每一个元素開始遍历。

我的解法是用map<int,int>和vector<int>来存储全部硬币的面值,当中map第二维记录这个面值出现的次数。以便应对能够拿两个同样硬币支付的情况。

然后将vector依照升序排序。遍历vector,依据要支付的金额减去当前面值计算出应该找到的硬币,然后去map中找,找到则输出,然后直接返回,注意对两个同样面值硬币的特殊处理。

代码例如以下:

#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
#include <stdio.h>

using namespace std;

int main()
{
    map<int,int> coinMap;
    vector<int> coins;
    int N,M;
    cin >> N >> M;
    int coin;
    for(int i = 0; i < N; i++){
        scanf("%d",&coin);
        if(coinMap.find(coin) == coinMap.end()){
            coinMap[coin] = 1;
        }else{
            coinMap[coin] += 1;
        }
        coins.push_back(coin);
    }
    sort(coins.begin(),coins.end());
    int now,need;
    for(int i = 0; i < coins.size(); i++){
        now = coins[i];
        need = M - now;
        if(need == now){
            if((coinMap.find(need)!=coinMap.end())&&(coinMap[need]==2)){
                printf("%d %d\n",need,need);
                return 0;
            }
        }else{
            if(coinMap.find(need) != coinMap.end()){
                if(need > now){
                    printf("%d %d\n",now,need);
                }else{
                    printf("%d %d\n",need,now);
                }
                return 0;
            }
        }
    }

    printf("No Solution");

    return 0;
}


1048. Find Coins (25)