题目大意:拿最少的钱买尽可能多的东西
思路解析
因为有满减优惠,所以根据贪心策略即尽可能多的使用优惠券,但优惠券有使用门槛,我们要使的手里的钱加上减的大于等于门槛
(越大越好,因为可以买到更多的食物)。所以可以这样做:
用pair<long long,long long>存下和
储存到vector容器中,然后将
从小到大排序,
求一下前缀和存到b[N]数组里,然后枚举寻找答案。
废话不多说,代码如下:
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using T = pair<ll, ll>;
//set<int>S;
//unordered_map<int, int>mp;
const int N = 1e5 + 10;
ll b[N];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int t; cin >> t;
while (t--) {
ll n, m; cin >> n >> m;
vector<T>v;
ll i;
for (i = 1; i <= n; ++i) {
ll x, y; cin >> x >> y;
v.push_back({ x,y });
}
sort(v.begin(), v.end());
for (i = 0; i < v.size(); ++i) {
b[i + 1] = b[i] + v[i].second;
}
for (i = v.size() - 1; i >= 0; --i) {
if (b[i + 1] + m >= v[i].first)break;
}
if (i >= 0)cout << m + b[i + 1] << endl;
else cout << m << endl;
}
return 0;
}