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


  • 相关阅读:
    paip.提升用户体验上传文件图片命名
    paip.提升安全性软键盘的弱点
    paip.java桌面开发应用与WEB RIA应用
    paip.提升安全性WEB程序安全检测与防范
    paip.PHP zend解密—以SHOPEX4.8.4为例
    PAIP.提升安全性COOKIE绑定IP与城市与运营商
    paip.svn不能提交CLEARUP不起作用解决方法
    paip.提升安全网站登录密码明文传输的登录高危漏洞解决方案
    paip.docfile二进制复合文档
    paip.session的调试in php
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/6863141.html
Copyright © 2011-2022 走看看