有三种难度的题目分别为Easy/Medium/Hard,现在你总共有E+EM+M+MH+H道题,各个字符串的含义如下:
某个公众号总结在这里
E表示有E道题目难度为Easy
EM表示有EM道题目难度为Easy或者Medium
M表示有M道题目难度为Medium
MH表示有MH道题目难度为Medium或者Hard
H表示有H道题目难度为Hard
你要用这些题目出尽量多的模拟赛,为了保证题目质量且含有一定的区分量,每场模拟赛需要包含Easy Medium Hard三种难度的题目各一道,每道题目至多只能出现在一场比赛中。求你最多能出多少场模拟赛
输入描述
一行五个整数,E,EM,M,MH,H
0 <= E+EM+M+MH+H <= 10^18
输出描述
输出你最多能出多少场模拟赛
示例1
输入
2 2 1 2 2
输出
3
说明
三组分别是
E + EM + H
E + MH + H
EM + M + MH
思路:二分查找,限定值mid后判断该值是不是可以满足
先对E和H进行处理,补到mid的大小,然后在计算剩下的M和MH、EM的和能不能达到mid
def main():
[E, EM, M, MH, H] = list(map(int, input().split()))
max_val = (E + EM + M + MH + H) // 3
def find(i, E, EM, M, MH, H):
if E < i:
cur = min(i - E, EM)
E += cur
EM -= cur
if H < i:
cur = min(i - H, MH)
H += cur
MH -= cur
if M + EM + MH >= i and E >= i and H >= i:
return True
return False
res = 0
left, right = 0, max_val
while left <= right:
mid = (left + right) // 2
if find(mid, E, EM, M, MH, H):
left = mid + 1
res = max(res, mid)
else:
right = mid - 1
print(res)
main()