PAT Advanced 1048 Find Coins (25) [Hash散列]

题目

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

题目分析

  1. int ts[1001],保存输入硬币面值出现次数
  2. int coins[N],保存输入硬币
  3. 输入时,统计面值出现次数
  4. sort(对coins进行升序排序)
  5. 遍历输入硬币,判断 M-当前硬币面值 的面值是否在输入的硬币中出现过
    • 如果coins[i]==M-coins[i],M-coins[i]面值最少出现两次
    • 如果coins[i]<M-coins[i],M-coins[i]面值最少出现一次
    • 如果coins[i]>M-coins[i],不满足条件A1<=A2

易错点

  1. A1<=A2(自己bug)
  2. ts大小设置应为1001,而不是501(题目已知:1<面值<=500,但是0<M<=1000),因为ts记录的是面值,所以可能搜索最大面值M=999(M=1000,v1=1)出现次数的情况,若ts大小设置为500,将会下标将会越界。(自己bug)

Code

Code 01

#include <iostream>
#include <algorithm>
using namespace std;
int main(int argc,char * argv[]) {
    int N,M;
    scanf("%d %d",&N,&M);
    int coins[N]= {0};
    int values[1001]= {0};
    for(int i=0; i<N; i++) {
        scanf("%d",&coins[i]);
        values[coins[i]]++;
    }
    sort(coins,coins+N);
    int i;
    for(i=0; i<N; i++) {
        if((coins[i]==M-coins[i]&&values[coins[i]]>=2)
                ||(coins[i]<M-coins[i]&&values[M-coins[i]]>=1)) { //!= 第二个点错误 
            printf("%d %d", coins[i], M-coins[i]);
            break;
        }
    }
    if(i==N)printf("No Solution");
    return 0;
}


猜你喜欢

转载自www.cnblogs.com/houzm/p/12238561.html