PAT 甲级 1048 Find Coins 二分的写法
散列的写法非常简单明了,LeetCode Problem List很前面就有类似的题。其实这道题用二分实现也是可以的,下面是二分的写法。之后准备做一个二分的专题总结。
#include <bits/stdc++.h>
using namespace std;
int main()
{
#ifdef LOCAL
freopen("input.txt", "r", stdin);
#endif
int N, M;
cin >> N >> M;
vector<int> coins(N);
for (auto& i : coins) cin >> i;
sort(coins.begin(), coins.end());
for (int i = 0; i < N; ++i) {
int need_to_find = M - coins[i];
// 二分, 找到第一个大于等于need_to_find的数
// 对于重复元素,第一次走到这里的时候会退出,但是下面的判断beg==i过不了
// 然后i+1,下一次判断的时候得到的beg仍然是第i位的,所以没有问题
int beg = 0, end = N, mid;
while (beg < end) {
mid = beg + (end - beg) / 2;
if (coins[mid] < need_to_find) {
beg = mid + 1;
}
else {
end = mid;
}
}
if (coins[beg] == need_to_find && beg != i) {
printf("%d %d\n", coins[i], coins[beg]);
return 0;
}
}
cout << "No Solution";
return 0;
}