1532. 找硬币(PAT甲级真题1048)

From AcWing

伊娃喜欢从整个宇宙中收集硬币。

有一天,她去了一家宇宙购物中心购物,结账时可以使用各种硬币付款。

但是,有一个特殊的付款要求:每张帐单,她只能使用恰好两个硬币来准确的支付消费金额。

给定她拥有的所有硬币的面额,请你帮她确定对于给定的金额,她是否可以找到两个硬币来支付。

输入格式

第一行包含两个整数 \(N\)\(M\),分别表示硬币数量以及需要支付的金额。

第二行包含 \(N\) 个整数,表示每个硬币的面额。

输出格式

输出一行,包含两个整数 \(V_1\),\(V_2\),表示所选的两个硬币的面额,使得 \(V_1\) \(\le\) \(V_2\) 并且 \(V_1\)+\(V_2\)=\(M\)

如果答案不唯一,则输出 \(V_1\) 最小的解。

如果无解,则输出 No Solution

数据范围

\(1\)\(\le\)\(N\)\(\le\)\(10^5\)
\(1\)\(\le\)\(M\)\(\le\)\(10^3\)

输入样例1

8 15
1 2 8 7 2 4 11 15

输出样例1

4 11

输入样例2

7 14
1 8 7 2 4 11 15

输出样例2

No Solution


代码

#include <iostream>
#include <algorithm>

using namespace std;
const int N = 100010;
int n , m ;
int a[N];
int main(){
    cin >> n >> m;
    for(int i = 0 ; i < n ; i++) cin >> a[i];
    sort(a,a+n);
    int l = 0 , r = n-1;
    for( l = 0 ; l < r ; l++){
        while(l!=r && a[l]+a[r]>=m){
            if(a[l]+a[r]==m){
            cout << a[l] << " " << a[r];
            return 0;
            }
            else --r;
        }
    }
    cout << "No Solution" << endl;
    return 0;
}
posted @ 2021-01-23 20:11  皮使我快乐  阅读(111)  评论(0)    收藏  举报