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;
}
要一直快乐