zoukankan      html  css  js  c++  java
  • 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
    ",need,need);
                    return 0;
                }
            }else{
                if(coinMap.find(need) != coinMap.end()){
                    if(need > now){
                        printf("%d %d
    ",now,need);
                    }else{
                        printf("%d %d
    ",need,now);
                    }
                    return 0;
                }
            }
        }
    
        printf("No Solution");
    
        return 0;
    }
    


  • 相关阅读:
    sql注入之payload
    cve2019-0708漏洞复现
    xss学习
    kernel panic not syncing
    nodeJS爬虫
    JS刷题自制参考知识
    HTML Cookie
    点击按钮触发div颜色改变的几种写法
    Bootstrap4布局(简要)
    jQuery实现论坛发帖Demo
  • 原文地址:https://www.cnblogs.com/aiwz/p/6154131.html
Copyright © 2011-2022 走看看