- 题目
- 题解(36)
- 讨论(31)
- 排行
入门 通过率:49.28% 时间限制:1秒 空间限制:256M
知识点贪心

校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。
描述
小红的购物车结算金额为 nn 元,她手中有 mm 张优惠券。第 jj 张优惠券的规则为"满 ajaj 元立减 bjbj 元",即若 n≧ajn≧aj,则使用该券后需支付 n−bjn−bj 元。
小红至多使用一张优惠券,请问最少需要支付多少元?
输入描述:
第一行输入两个整数 n,m(1≦n≦105; 1≦m≦100)n,m(1≦n≦105; 1≦m≦100)。
接下来 mm 行,第 jj 行输入两个整数 aj,bj(1≦bj≦aj≦105)aj,bj(1≦bj≦aj≦105),描述第 jj 张优惠券。
输出描述:
输出一个整数,表示小红使用最优策略后需支付的最少金额。
示例1
输入:
100 3
300 50
200 30
50 5
复制输出:
95
复制说明:
仅第三张券可用,支付 100−5=95100−5=95 元。
cpp
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
using ull=unsigned long long;
using i128=__int128_t;
using u128=__uint128_t;
using ld=long double;
void solve()
{
int n,m,x,y;
cin >> n >> m;
vector<int>v;//将所有可以使用的卷的优惠金额放进去
while(m--)
{
cin >> x >> y;
if(n>=x) v.push_back(y);
}
sort(v.begin(),v.end(),greater<int>());//降序排序 选出优惠力度最大的卷
if(v.empty()) cout << n;//别忘了 一张卷都用不了 要输出n本身
else cout << n-v[0];
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t=1;
//cin >> t;
while(t--)
{
solve();
}
return 0;
}