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)
1 9

相关推荐

03-29 18:59
运城学院 Java
程序员小白条:咱们要对自己的简历和学历有清晰的认知,不要动不动就大厂了....都26届了,没实习还想着大厂,唉
点赞 评论 收藏
分享
牛客网
牛客网在线编程
牛客网题解
牛客企业服务