题目

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)

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

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

#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};
for(int i=0; i<N; i++) {
scanf("%d",&coins[i]);
}
sort(coins,coins+N);
bool flag = false;
for(int i=0; i<N; i++) {
//二分查找是否存在 M-coins[i];
int left = i+1,right=N-1;
int mid = left+((right-left)>>1);
while(left<=right) {
mid = left+((right-left)>>1);
if(coins[mid]==M-coins[i]) {
break;
} else if(coins[mid]>M-coins[i]) {
right = mid-1;
} else {
left = mid+1;
}
}
if(left>right)continue; //没有找到 M-coins[i];
else { //已找到 M-coins[i],打印,并退出(因为按照coins[i]升序顺序查找,所以第一次找到的就是最小值)
printf("%d %d",coins[i],coins[mid]);
flag = true;
break;
}
}
if(!flag)printf("No Solution");
return 0; }

最新文章

  1. IOS Animation-CABasicAnimation例子(简单动画实现)
  2. 读取XML文档结构并写入内容
  3. Java:多线程,使用同步锁(Lock)时利用Condition类实现线程间通信
  4. Base64 Encoding / Decoding in Node.js
  5. [Angular 2] Use Service use Typescript
  6. 前端——HTML笔记Two
  7. 4.Apache Spark的工作原理
  8. [转载] 使用Redis的Java客户端Jedis
  9. 如何为form表单的button设置submit事件
  10. PLSQL实现分页查询
  11. java锁与监视器概念 为什么wait、notify、notifyAll定义在Object中 多线程中篇(九)
  12. background属性冲突导致的部分浏览器背景图片不显示问题
  13. 使用java注解实现toJson方法
  14. Mac OS mysql数据库安装与初始化
  15. 机器学习排序算法:RankNet to LambdaRank to LambdaMART
  16. tls1.2 rfc5246
  17. 1093. Count PAT&#39;s
  18. js 获取北京时间
  19. JwtBearerAppBuilderExtensions.UseJwtBearerAuthentication(IApplicationBuilder
  20. 拟物设计和Angular的实现 - Material Design

热门文章

  1. 实验吧-隐写术-九连环(steghide)
  2. Python MongoDB 创建数据库
  3. spring教程
  4. SpringBoot+SpringSecurity之多模块用户认证授权同步
  5. Sql server 表表达式
  6. h5-360_introduce页面案例
  7. Java8大排序算法
  8. Upgrade to 17.1 from 17.0 problem:UnicodeEncodeError: &#39;ascii&#39; codec can&#39;t encode character &#39;\xc4&#39; in position 50: ordinal not in range(128)
  9. centos 7.4 安装docker 19.03.6 版本。附带离线安装包
  10. socket 错误之:OSError: [WinError 10057] 由于套接字没有连接并且(当使用一个 sendto 调用发送数据报套接字时)没有提供地址,发送或接收数据的请求没有被接受。