伊娃喜欢从整个宇宙中收集硬币。
有一天,她去了一家宇宙购物中心购物,结账时可以使用各种硬币付款。
但是,有一个特殊的付款要求:每张帐单,她只能使用恰好两个硬币来准确的支付消费金额。
给定她拥有的所有硬币的面额,请你帮她确定对于给定的金额,她是否可以找到两个硬币来支付。
输出一行,包含两个整数 V1,V2,表示所选的两个硬币的面额,使得 V1≤V2并且 V1+V2=M。
如果答案不唯一,则输出 V1 最小的解。
思路:排序,枚举每一个面额,是否存在对应的与之相加为m的另一个面额。
注:同面额可以多张,我自己没有仔细看样例导致没有少了测试点3的判断条件
#include<bits/stdc++.h>
#define rep(i,a,n) for(int i=a;i<n;i++)
#define INF 0x3f3f3f;
using namespace std;
const int N=1e5+233;
int n,m;
int a[N],vis[N];
void gao(){
sort(a,a+n);
rep(i,0,n){
if(vis[a[i]]&&vis[m-a[i]]){
if(a[i]==m-a[i]&&vis[a[i]]<2) continue;//测试点3
cout<<a[i]<<" "<<m-a[i]<<endl;
return ;
}
}
cout<<"No Solution"<<endl;
}
int main(){
cin>>n>>m;
rep(i,0,n){
cin>>a[i];
vis[a[i]]++;
}
gao();
return 0;
}