原题链接
思路:
因为要尽可能少地分组,并且每组最多两个纪念品,所以我们可以采用贪心的策略:即每一次看当前未分组的纪念品中价格最高的和价格最低的纪念品的价格的和是否会超过限制,如果会超过限制,让右指针左移,左指针保持当前的位置,否则,左指针右移,右指针左移,当左右指针错开时,即 l > r 时,结束遍历.
参考代码:
#include <bits/stdc++.h>
using ll = long long;
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int cnt{};
int w, n;
std::cin >> w >> n;
std::vector<int> a(n);
for (auto &it : a) {
std::cin >> it;
}
std::sort(a.begin(), a.end());
int l = 0, r = n - 1;
while (l <= r) {
if (a[l] + a[r] <= w) {
l++, r--;
} else {
r--;
}
cnt++;
}
std::cout << cnt;
return 0;
}