题目

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 10^5 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 (<=10^5,the total number of coins) and M(<=10^3, 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

题目分析

每笔交易只能使用两枚硬币交易,已知一些硬币面值,挑选两枚硬币V1,V2进行支付,要求满足两个条件必须V1+V2=M(交易金额),V1<=V2,如果可以找到V1,V2,打印;否则,打印"No Solution"

解题思路

思路 01 (最优、hash)

查找M-coins[i]时间复杂度为O(1)

  1. int ts[1001],保存输入硬币面值出现次数
  2. int coins[N],保存输入硬币
  3. 输入时,统计面值出现次数记录在ts中
  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

思路 02(二分查找,可对比思路01)

查找M-coins[i]时间复杂度为O(logn)

  1. 对输入的硬币,进行排序sort(对coins进行升序排序)
  2. 遍历coins[i],并使用二分思想查找M-coins[i]是否在数组的i+1到N-1位置,如果有打印,否则跳过继续寻找M-coins[i+1]

易错点

  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(最优、hash)

  1. #include <iostream>
  2. #include <algorithm>
  3. using namespace std;
  4. int main(int argc,char * argv[]) {
  5. int N,M;
  6. scanf("%d %d",&N,&M);
  7. int coins[N]= {0};
  8. int values[1001]= {0};
  9. for(int i=0; i<N; i++) {
  10. scanf("%d",&coins[i]);
  11. values[coins[i]]++;
  12. }
  13. sort(coins,coins+N);
  14. int i;
  15. for(i=0; i<N; i++) {
  16. if((coins[i]==M-coins[i]&&values[coins[i]]>=2)
  17. ||(coins[i]<M-coins[i]&&values[M-coins[i]]>=1)) { //!= 第二个点错误
  18. printf("%d %d", coins[i], M-coins[i]);
  19. break;
  20. }
  21. }
  22. if(i==N)printf("No Solution");
  23. return 0;
  24. }

Code 02(非最优不推荐、二分查找)

  1. #include <iostream>
  2. #include <algorithm>
  3. using namespace std;
  4. int main(int argc, char * argv[]) {
  5. int N,M;
  6. scanf("%d %d", &N,&M);
  7. int coins[N]= {0};
  8. for(int i=0; i<N; i++) {
  9. scanf("%d",&coins[i]);
  10. }
  11. sort(coins,coins+N);
  12. bool flag = false;
  13. for(int i=0; i<N; i++) {
  14. //二分查找是否存在 M-coins[i];
  15. int left = i+1,right=N-1;
  16. int mid = left+((right-left)>>1);
  17. while(left<=right) {
  18. mid = left+((right-left)>>1);
  19. if(coins[mid]==M-coins[i]) {
  20. break;
  21. } else if(coins[mid]>M-coins[i]) {
  22. right = mid-1;
  23. } else {
  24. left = mid+1;
  25. }
  26. }
  27. if(left>right)continue; //没有找到 M-coins[i];
  28. else { //已找到 M-coins[i],打印,并退出(因为按照coins[i]升序顺序查找,所以第一次找到的就是最小值)
  29. printf("%d %d",coins[i],coins[mid]);
  30. flag = true;
  31. break;
  32. }
  33. }
  34. if(!flag)printf("No Solution");
  35. return 0;
  36. }

PAT Advanced 1048 Find Coins (25) [Hash散列]的更多相关文章

  1. PAT Advanced 1134 Vertex Cover (25) [hash散列]

    题目 A vertex cover of a graph is a set of vertices such that each edge of the graph is incident to at ...

  2. PAT Advanced 1048 Find Coins (25 分)

    Eva loves to collect coins from all over the universe, including some other planets like Mars. One d ...

  3. PAT Advanced 1084 Broken Keyboard (20) [Hash散列]

    题目 On a broken keyboard, some of the keys are worn out. So when you type some sentences, the charact ...

  4. PAT Advanced 1050 String Subtraction (20) [Hash散列]

    题目 Given two strings S1 and S2, S = S1 – S2 is defined to be the remaining string afer taking all th ...

  5. PAT Advanced 1041 Be Unique (20) [Hash散列]

    题目 Being unique is so important to people on Mars that even their lottery is designed in a unique wa ...

  6. PAT甲 1048. Find Coins (25) 2016-09-09 23:15 29人阅读 评论(0) 收藏

    1048. Find Coins (25) 时间限制 50 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Eva loves t ...

  7. PAT 甲级 1048 Find Coins (25 分)(较简单,开个数组记录一下即可)

    1048 Find Coins (25 分)   Eva loves to collect coins from all over the universe, including some other ...

  8. PAT甲题题解-1078. Hashing (25)-hash散列

    二次方探测解决冲突一开始理解错了,难怪一直WA.先寻找key%TSize的index处,如果冲突,那么依此寻找(key+j*j)%TSize的位置,j=1~TSize-1如果都没有空位,则输出'-' ...

  9. PAT Basic 1047 编程团体赛(20) [Hash散列]

    题目 编程团体赛的规则为:每个参赛队由若⼲队员组成:所有队员独⽴⽐赛:参赛队的成绩为所有队员的成绩和:成绩最⾼的队获胜.现给定所有队员的⽐赛成绩,请你编写程序找出冠军队. 输⼊格式: 输⼊第⼀⾏给出⼀ ...

随机推荐

  1. 二十四、SAP中打开帮助文件

    一.在代码输入界面,选中一个关键词,按一下F1,或者问号 二.显示出的帮助内容

  2. java基础源码 (5)--reflect包-AccessibleObject类

    学习参考博客:https://blog.csdn.net/benjaminzhang666/article/details/9664585AccessibleObject类基本作用 1.将反射的对象标 ...

  3. 三星首款折叠屏手机Galaxy Fold上架中国官网

    2 月 28 日,在三星 Galaxy S10 系列新品发布会上,备受期待的三星首款可折叠屏手机 Galaxy Fold 也在中国正式亮相.目前,Galaxy Fold 已正式上架三星中国官网,可以预 ...

  4. 读书笔记 - js高级程序设计 - 第十章 DOM

      文档元素 是文档的最外层元素,在Html页面中,文档元素始终都是<html>元素 在xml中,任何元素都可以是文档元素 Node类型 Node.ELEMENT_NODE 元素 Node ...

  5. 从华硕裁员、分拆业务看传统PC企业转型到底有多难?

    近段时间,华硕的处境可谓"冰火两重天".一方面,华硕正式发布ROG游戏手机.这款手机以超强性能和华丽外观,让游戏玩家群体为之沸腾.即使最高售价高达12999元,还是有不少玩家趋之若 ...

  6. 大数据高可用集群环境安装与配置(10)——安装Kafka高可用集群

    1. 获取安装包下载链接 访问https://kafka.apache.org/downloads 找到kafka对应版本 需要与服务器安装的scala版本一致(运行spark-shell可以看到当前 ...

  7. 2020牛客寒假算法基础集训营4 G音乐鉴赏

    题目描述 作为“音乐鉴赏”课的任课老师,你的课程作为刷学分好课一直受到广泛欢迎.但这一学期,学校制定了新的标准,你的课的优秀率(分数超过90分的人数)被限制在10%以下! 为了应对这个调整,你要求所有 ...

  8. 虚拟机vmware vmnet8 未识别(转)

    原文链接:https://blog.csdn.net/windows_q/article/details/50678646

  9. 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring基于XML装配Bean

    Bean 的装配可以理解为依赖关系注入,Bean 的装配方式也就是 Bean 的依赖注入方式.Spring 容器支持多种形式的 Bean 的装配方式,如基于 XML 的 Bean 装配.基于 Anno ...

  10. C++ Opencv播放AVI

    #include "cxcore.h" #include "cvcam.h" #include "windows.h" #include & ...