我的做法为线性时间复杂度,当然也可以使用双指针继续优化到logn
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e5;
int n,goal;//n表示硬币数,goal表示要凑出的值
int num[N],pocket[N];//num[i]表示价值为i的硬币的个数,pocket存放硬币的价值序列
int main() {
cin >> n >> goal;
for (int i = 0;i < n;i++) {
cin >> pocket[i];
num[pocket[i]]++;
}
sort(pocket,pocket + n);//因为答案可能不唯一要求输出V1<=V2的值,所以不妨排个序
for (int i = 0;i < n;i++) {
num[pocket[i]]--;//防止出现最终两个价值相同的硬币,但数量不足2的情况
int need = goal - pocket[i];
if (need < pocket[i]) break;//如果V2 > V1,,说明后面已经不可能找到满足要求的;
if (num[need] > 0 && pocket[i] <= need) {
cout << pocket[i] << ' ' << need << endl;
return 0;
}
num[pocket[i]]++;//回溯
}
cout << "No Solution" << endl;
}