题目
题目大意
给出硬币的个数n和要付费的钱m,接下来给出每个硬币的面值。要求从这些硬币中找到两个硬币v1, v2,使得v1 + v2 == m,且v1 < v2,输出v1 v2。如果不能找到这两个硬币,输出No Solution。
思路
刚开始用的模拟,即代码中被注释掉的部分,外循环从第一个硬币开始遍历,内循环从最后一个硬币开始遍历,但是有测试点超时。所以后来又改了二分法来查找。
代码
cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int n, m;
vector<int> v;
int erfen(int i){
int low = i + 1, high = n - 1;
while (low <= high){
int mid = (low + high) / 2;
if (v[mid] == m - v[i]){
return v[mid];
}else if (v[mid] > m - v[i]){
high = mid - 1;
}else{
low = mid + 1;
}
}
return -1;
}
int main(){
cin >> n >> m;
v.resize(n);
for (int i = 0; i < n; i++){
cin >> v[i];
}
sort(v.begin(), v.end());
for (int i = 0; i < n; i++){
/*for (int j = n - 1; j > i; j--){
if (v[i] + v[j] == m){
cout << v[i] << " " << v[j] << endl;
return 0;
}else if (v[i] + v[j] < m){
break;
}
}*/
int res = erfen(i);
if (res != -1){
cout << v[i] << " " << res << endl;
return 0;
}
}
cout << "No Solution" << endl;
return 0;
}