2022-03-29 21:01
湖南大学 深度学习 永远喜欢18岁:t2贴一个O(logn)解法:
显然,最大值为(a + b) // (x + y),下面对0到(a + b) // (x + y)二分check最大值max是否可以由max得到答案。
首先特判x=y的情况,max为min(a, b) // x。
设二分过程中的值为m,则可以由m得到答案(*)等价于存在m1使得m1*x+(m-m1)*y<=a 且 m1*y+(m-m1)*x<=b,分x>y和x<y讨论,解上面两个不等式得到m1的上界right和下界left,对right向下取整,对left向上取整,则(*)等价于left<=right 且left<=m且right>=0。
import math
a, b, x, y = map(int,input().split(' '))
if x == y:
print(min(a, b) // x)
else:
l, r = 0, (a + b) // (x + y)
while l <= r:
mid = (l + r ) // 2
if x > y:
left, right = (b - mid * x)/(y - x), (a - mid * y)/(x - y)
else:
right, left = (b - mid * x)/(y - x), (a - mid * y)/(x - y)
right, left = math.floor(right), math.ceil(left)
if left <= right and mid >= left and 0 <= right:
l = mid + 1
else:
r = mid - 1
print(r)
0 点赞 评论 收藏
分享
创作者周榜
更多
关注他的用户也关注了: