pat甲级1048. Find Coins (25)

3人阅读 评论(0) 收藏 举报
分类:

原题链接:https://www.patest.cn/contests/pat-a-practise/1048

1048. Find Coins (25)

时间限制
100 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue

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

3种方法:

1、二分查找

算法设计:

将输入的数据存储在长度为N的数组A中,将A数组元素从小到大进行排序,遍历整个数组,对于遍历到的元素A[i],在[i+1,N)中利用二分查找算法查找是否有M-A[i]这个数,有则按要求进行输出;如果数组遍历完仍然没有找到,则输出"No Solution"

c++代码:

#include<bits/stdc++.h>
using namespace std;
int main(){
    int N,M;
    scanf("%d%d",&N,&M);
    int A[N];
    for(int i=0;i<N;++i)
        scanf("%d",&A[i]);
    sort(A,A+N);
    for(int i=0;i<N;++i){
        if(binary_search(A+i+1,A+N,M-A[i])){
            printf("%d %d",A[i],M-A[i]);
            return 0;
        }
    }
    printf("No Solution");
    return 0;
}

2、two pointers

算法设计:

将输入的数据存储在长度为N的数组A中,将A数组元素从小到大进行排序,定义两个索引 i=0、j=N-1,如果i<j则进行循环并进行以下判断:

  1. 如果A[i]+A[j]>M,令 j 左移一位,--j
  2. 如果A[i]+A[j]<M,令 i 右移一位,++i
  3. 如果A[i]+A[j]==M,说明找到了一组符合要求的两个数,输出,退出循环

如果当i<j退出循环时仍然没有找到符合要求的两个数,则输出"No Solution"

c++代码:

#include<bits/stdc++.h>
using namespace std;
int main(){
    int N,M;
    scanf("%d%d",&N,&M);
    int A[N];
    for(int i=0;i<N;++i)
        scanf("%d",&A[i]);
    sort(A,A+N);
    for(int i=0,j=N-1;i<j;)
        if(A[i]+A[j]>M)
            --j;
        else if(A[i]+A[j]<M)
            ++i;
        else{
            printf("%d %d",A[i],A[j]);
            return 0;
        }
    printf("No Solution");
    return 0;
}

3、散列

算法设计:

定义一个map<int,int>类型变量,键存储输入的数据,值存储该数据出现了几次。遍历整个map,如果出现下列任何一种情况就说明找到了符合要求的两个数,直接进行输出:

  1. 遍历到的键是M的一半且遍历到的值>=2
  2. 遍历到的键不是M的一半且M减去该键得到的数在map中能够找到与之相等的键

如果map遍历完仍然没有找到符合要求的两个数,则输出"No Solution"

c++代码:

#include<bits/stdc++.h>
using namespace std;
int main(){
    int N,M;
    scanf("%d%d",&N,&M);
    map<int,int>m;
    while(N--){
        int a;
        scanf("%d",&a);
        ++m[a];
    }
    for(auto i=m.cbegin();i!=m.cend();++i){
        if((M-i->first==i->first&&i->second>=2)||(M-i->first!=i->first&&m.find(M-i->first)!=m.cend())){
            printf("%d %d",i->first,M-i->first);
            return 0;
        }
    }
    printf("No Solution");
    return 0;
}

查看评论

【PAT】1048. Find Coins (25)

题目链接:http://pat.zju.edu.cn/contests/pat-a-practise/1048 题目描述: Eva loves to collect coins from al...
  • realxuejin
  • realxuejin
  • 2013-08-26 19:44:58
  • 1446

1048. Find Coins (25)-PAT甲级真题(Hash散列)

1048. Find Coins (25) Eva loves to collect coins from all over the universe, including some other p...
  • liuchuo
  • liuchuo
  • 2016-08-08 16:42:06
  • 190

PAT 1076. Forwards on Weibo

题目:http://pat.zju.edu.cn/contests/pat-a-practise/1076 题解: 共有n个微博号,第i行表明有k个人关注i,问x再转发m层的范围内可以转发多少人的微博...
  • ACM_Ted
  • ACM_Ted
  • 2014-03-09 02:14:21
  • 1780

1068. Find More Coins (30)-PAT甲级真题(01背包)

1068. Find More Coins (30) Eva loves to collect coins from all over the universe, including som...
  • liuchuo
  • liuchuo
  • 2016-08-22 17:37:42
  • 270

PAT-Find Coins (25)

题意: 解答: 经典2-sum,问题,从一串数里找到两个和为m。做法: 把数组排序,然后用两头扫的办法。 i = 0, j = n - 1 如果a[i] + a[j] 如果a[i] + a...
  • zhouyufei0001
  • zhouyufei0001
  • 2016-03-10 10:15:15
  • 154

PAT 甲级 1048. Find Coins (25)

Eva loves to collect coins from all over the universe, including some other planets like Mars. One d...
  • zengjingchao
  • zengjingchao
  • 2017-09-30 00:50:07
  • 61

PAT甲级1048. Find Coins (25)

Eva loves to collect coins from all over the universe, including some other planets like Mars. One d...
  • liaotl10
  • liaotl10
  • 2017-02-28 21:33:40
  • 127

1048. Find Coins (25)-PAT甲级

题目:Eva loves to collect coins from all over the universe, including some other planets like Mars. On...
  • ZZLCSDN2017
  • ZZLCSDN2017
  • 2017-04-17 14:54:56
  • 116

【PAT甲级】1048. Find Coins (25)

#include int main(int argc, char *argv[]) { int n, m; int face[501] = {0}; //vector v; ...
  • lambsnow
  • lambsnow
  • 2016-10-26 19:08:57
  • 69
    个人资料
    持之以恒
    等级:
    访问量: 3315
    积分: 2225
    排名: 2万+
    文章存档
    最新评论