测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

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)
上一题 下一题