第一题略
🍕 奶牛用餐
每头牛吃完的时间 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()