洛谷P13013题解

分析

这道题目要求我们计算在给定两种优秀券的数量限制下,最多可以兑换多少份奖品。兑换规则有两种方式:

  1. 使用 aa 张课堂券和 bb 张作业券。

  2. 使用 bb 张课堂券和 aa 张作业券。

首先我们确保 aba \le b,处理会更加方便,也就是说当 a>ba > b 时需要交换 aabb

a=ba = b 时,兑换方式只有一种,直接取两种券数量的较小值除以 aa 即可。

对于 aba \neq b 情况,我们使用二分查找来确定最大兑换份数 mid\operatorname{mid}

对于 mid\operatorname{mid},我们需要满足:

  1. 每种券至少能提供 a×mida \times \operatorname{mid} 张。

  2. 剩余券的数量能够满足另一种兑换方式的需求。

所以得出条件:

mid(na×mid)/(ba)+(ma×mid)/(ba)\operatorname{mid} \le (n - a \times \operatorname{mid}) / (b - a) + (m - a \times \operatorname{mid}) / (b - a)

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<bits/stdc++.h>
using namespace std;
int main() {
long long n, m, a, b; //一定要开 long long
cin >> n >> m >> a >> b;
if (a > b) swap(a, b);
if (a == b) {
cout << min(n, m) / a;
return 0;
}
long long l = 0, r = 1e9;
while (l < r) {
long long mid = (l + r + 1) / 2;
if (n < a * mid || m < a * mid || (n - a * mid) / (b - a) + (m - a * mid) / (b - a) < mid) r = mid - 1;
else l = mid;
}
cout << l;
return 0;
}

洛谷P13013题解
https://lijingshu2014.github.io/2025/10/03/洛谷P13013题解/
作者
lijingshu
发布于
2025年10月3日
许可协议