找两个硬币看能不能付钱,两个硬币必须正好等于要付的价格。
那就直接从小到大排序,然后从第一个元素开始,找价格减去当前硬币的价值,看能不能找到。
注意二分查找的最后位置。这个后面再找个时间研究下。里面其实有很多细节需要注意的。
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <map>
#include <queue>
#include <stack>
#include <cstring>
#define MAX 100010
using namespace std;
int n,m;
int coin[MAX];
int BinSearch(int num){
int l = 0 ,r = n - 1;
int pos = -1;
while(l < r){
int mid = (l + r + 1) /2 ;
if(coin[mid] < num)
l = mid + 1;
else if(coin[mid] > num)
r = mid - 1 ;
else{
pos = mid;
break;
}
}
return pos;
}
int main(){
scanf("%d%d",&n,&m);
for(int i = 0 ; i < n ; i++){
scanf("%d",&coin[i]);
}
sort(&coin[0],&coin[n]);
bool tag = false;
for(int i = 0; i < n ;i++){
int pos = BinSearch(m-coin[i]);
if(pos>0 && pos != i){
printf("%d %d\n",coin[i],coin[pos]);
tag = true;
break;
}
}
if(!tag)
printf("No Solution\n");
return 0;
}