Skip to content

第一题略

🍕 奶牛用餐

每头牛吃完的时间 time = 到达时间 + 吃的时间 + 等待时间。重点在于等待时间如何计算。

如果能想到窗口问题,那么这题就很简单。窗口大小就是能容纳的奶牛数量。 每次最先吃完的离开,意味着每次弹出一个最小值。这个最小值就是当前的时间。下一头牛的等待时间就是根据这个最小值计算的。

py
from queue import PriorityQueue

cowNum, seatNum = map(int, input().strip().split())
cows, eatTime = [], []
for _ in range(cowNum):
    si, ti = map(int, input().strip().split())
    cows.append(si)
    eatTime.append(ti)

def resolve():
    pq = PriorityQueue()
    order = 0

    # 初始化第一个窗口
    while order < seatNum:
        t = cows[order] + eatTime[order]
        pq.put(t)
        print(t)
        order += 1

    # 滑动窗口
    while order < cowNum:
        waitTime = max(pq.get() - cows[order], 0)
        t = cows[order] + eatTime[order] + waitTime
        pq.put(t)
        print(t)
        order += 1
resolve()

🍕 平衡括号字符串

没做出来。看了别人的题解后,发现这样子最简单:将所有的 # 都换成一个 ),除了最后一个 #。然后判断最后一个 # 应该等于多少个 ) 就可以了!

py
string = list(input().strip())

# 获取最后一个 # 后面的 ) 数量。如果后面的字符串不合法,返回 -1
def getRight(string):
    left, right = 0, 0
    lock = False
    for s in string:
        if not lock and s == ')':
            right += 1
        elif s == '(':
            lock = True
            left += 1
        elif s == ')':
            left -= 1

    if left > 0:
        return -1
    return right + (-left)


def resolve():
    i = 0
    slen = len(string)
    x = -1 # 输入保证一定有一个 #
    anslen = 0

    # 将所有的 # 替换成 )
    while i < slen:
        if string[i] == '#':
            anslen += 1
            x = i
            string[i] = ')'
        i += 1
    # 除了最后一个 #
    string[x] = '#'

    # 获取最后一个 # 后面有多少 )
    right = getRight(string[x:])
    if right == -1:
        print(-1)
        return

    # 获取最后一个 # 前面有多少 (
    left = 0
    for i in range(x):
        if left < 0:
            print(-1)
            return
        if string[i] == '(':
            left += 1
        elif string[i] == ')':
            left -= 1

    # 输出答案
    if left - right < 1:
        print(-1)
        return
    for i in range(anslen-1):
        print(1)
    print(left - right)

resolve()