A26837. 奖品兑换
填空题
困难
知识点
题目描述
奖品兑换
题目描述
班主任给上课专心听讲、认真完成作业的同学们分别发放了若干张课堂优秀券和作业优秀券。同学们可以使用这两种券找班主任兑换奖品。具体来说,可以使用a张课堂优秀券和b张作业优秀券兑换一份奖品,或者使用b张课堂优秀券和 a张作业优秀券兑换一份奖品。
现在小A有n张课堂优秀券和m张作业优秀券,他最多能兑换多少份奖品呢?
输入格式
第一行,两个正整数 n,m,分别表示小A持有的课堂优秀券和作业优秀券的数量。
第二行,两个正整数 a,b,表示兑换一份奖品所需的两种券的数量。
输出格式
输出共一行,一个整数,表示最多能兑换的奖品份数。
样例
输入样例 1
8 8
2 1输出样例 1
5输入样例 2
314159 2653589
27 1828输出样例 2
1599数据范围
对于 60% 的测试点,保证 1≤ a,b≤ 100,1≤n,m≤500。
对于所有测试点,保证1≤a,b≤104,1≤n,m≤109。
参考答案
# 接受小A持有的券的数量
n, m = map(int, input().split())
# 兑换奖品所需的券的数量
a, b = map(int, input().split())
#因为兑换礼品其实两种券可以交换,所以顺序不是很重要,直接令需求较少的一种券作为n或者a即可
n, m = min(n, m), max(n, m)
a, b = min(a, b), max(a, b)
def check(v):
"""
检测手头的券的数量能否兑换v份礼品
:param v: 目标礼品数目
:return 是或否
"""
# 兑换v份礼品需要的两种券的数量,尽可能用手头较多的劵来应对需求量较多的劵。
x, y = a * v, b * v
# 如果应对不过来,再想办法拿手头数量较少的劵应对需求较多的劵
# 相当于有v-t份礼品是a张手头较少的劵,b张手头较多的劵兑换的;剩下的t份奖品是a张手头较多的劵和b张手头较少的劵兑换的。
if y >= m and b > a:
t = (y - m + (b - a) - 1) // (b - a)
y -= t * (b - a)
x += t * (b - a)
return x <= n and y <= m
l, r = 0, int(1e9)
while l < r:
mid = (l + r + 1) // 2
if check(mid):
l = mid
else:
r = mid - 1
print(r)
上一题
下一题