1968. 奶牛赛跑

摘要
Title: 1968. 奶牛赛跑
Tag: 模拟、枚举、跑步比赛问题
Memory Limit: 64 MB
Time Limit: 1000 ms

Powered by:NEFU AB-IN

Link

1968. 奶牛赛跑

  • 题意

    见原题

  • 思路

    可以通过枚举整数点,通过比较在时刻整点时的距离大小,判断领先问题,一共大约1e6个点,枚举即可
    (因斜率变化,也就是速度变化的点,都是整点)

    为什么可以通过整点?
    考虑极端情况,即两个斜率变化的点相连的线段,且两点距离为1。
    考虑反证法,即不可以通过枚举整数点,那么也就是着两点之间存在另一个线在上面或下面的情况,也就是会出现一个上凸包或一个下凸包,但显然两个点只能形成一条直线,两条直线只能相交一点,所以两条直线不可能出现凸包,所以不成立,所以原假设成立。

  • 代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    n, m = map(int, input().split())

    N = int(1e6 + 10)
    a = [0] * N
    b = [0] * N

    s = 0 # 时刻
    for i in range(n):
    v, t = map(int, input().split())
    while t:
    s += 1
    a[s] = a[s - 1] + v
    t -= 1

    s = 0 # 时刻
    for i in range(m):
    v, t = map(int, input().split())
    while t:
    s += 1
    b[s] = b[s - 1] + v
    t -= 1

    ans = 0
    k = 0 # 0代表两者齐头并进,1代表a领先,2代表b领先
    for i in range(N):
    if a[i] > b[i]:
    if k == 2:
    ans += 1
    k = 1
    elif a[i] < b[i]:
    if k == 1:
    ans += 1
    k = 2

    print(ans)
使用搜索:谷歌必应百度