思路:
(1)先将所有硬币排序(sort())。
(2)将集合值从小到大赋值v1,寻找v2;注意用二分搜索找v2,否则会超时。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int N,M;
vector <int> coin;
int main()
{
int i;
cin>>N>>M;
for(i=0;i<N;i++){
int a;
cin>>a;
coin.push_back(a);
}
sort(coin.begin(),coin.end());
int ans=0;
int v1, v2;
for(i=0;i<N;i++){
if(coin[i]>M/2+1)
ans=-1;
else {
v1=coin[i];
v2=M-v1;
int p=i+1, q=N-1, m=(p+q)/2;
for(;p<=q;){
if(v2==coin[m]){
ans=1;
break;
}else if(v2>coin[m]){
p=m+1;
m=(p+q)/2;
}else if(v2<coin[m]){
q=m-1;
m=(p+q)/2;
}
}
}
if(ans!=0)
break;
}
if(ans==1)
cout<<v1<<" "<<v2;
else
cout<<"No Solution";
return 0;
}