题目如下:
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 15Sample Output 1:
4 11Sample Input 2:
7 14 1 8 7 2 4 11 15Sample 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; }