C. Mixing Water

https://codeforces.com/contest/1359/problem/C

这题目要是看了editorial之后觉得一点都不难,回来起来我的思路是有问题的,我把它当做扩展GCD来求解了。不要问我为什么这么想,当时脑子就是比较混乱。

editorial里面说的就非常清楚,hot/cold只有两种情况:

但是无论如何最终温度都是>=(h+c)/2的. 如果(h+c)/2>=t的话,那么k=1就是最好的结果,只有t>(h+c)/2的时候才需要不断地增加热水.

令((k+1)h+kc) / (2k+1) == t的话,那么k = (h-t)/(2t-h-c). k可能是一个分数,所以最好检查一些int(k)和int(k)+1这两个值那么值得到的结果更接近t.

def run(h, c, t):
    if (h + c - 2 * t) >= 0:
        return 2

    a = h - t
    b = 2 * t - h - c
    k = int(a / b)
    val1 = abs((k + 1) * h + k * c - (2 * k + 1) * t)
    val2 = abs((k + 2) * h + (k + 1) * c - (2 * k + 3) * t)
    # val1 / (2k+1) <= val2 / (2k+3), return 2k+1
    if val1 * (2 * k + 3) <= val2 * (2 * k + 1):
        ans = 2 * k + 1
    else:
        ans = 2 * k + 3
    return ans