新建的思源楼高达200层,构成了交大新的地标。楼里面有一部可以通达所有楼层的电梯,每上一层楼需要uu秒钟,下一层楼需要dd秒,每个楼层会停ss秒。目前电梯在第N(1 \le N \le 200)N(1≤N≤200)层的地面上。若某个楼层没有上下需求,则电梯运行中会跳过该楼层。电梯沿某个方向运行到该方向最后一个需要上下人的楼层后,若下方或上方没有请求但另一方方向有用梯需求,则转向运行。若电梯不需要上下运行,则会忽略该请求。 现有若干个楼层需要上下人,则满足这些请求最少需要耗费多长时间(包括最后的停留时间)? 注:电梯在向上或向下时,不会载前往相反方向的人。 输入 输入数据有若干组(最多不超过1000组),每组数据的第一行为四个如题目中所示的整数N,u,d,sN,u,d,s,由空格分隔开。第二行为不同楼层需要上下楼的请求, 最多不超过1000个。每个请求的格式为from-to,其中from和to为所在楼层和要到达的楼层,保证from \ne tofrom =to。 输出 对每组测试数据,在单独的行中输出结果。先输出当前测试样例的组号Case c:,c为样例编号,从1开始。随后在同一行中输出满足这些请求最少需要消耗的时间。 使用c
时间: 2024-03-22 17:41:46 浏览: 150
这道题目是典型的模拟题,需要按照题目所给的规则模拟电梯的运行过程,同时需要记录电梯的位置、运行方向、等待上下人的楼层等信息。以下是一份Python的代码,可以供您参考:
```python
import sys
def solve(n, u, d, s, requests):
# 初始化电梯的位置、方向、等待上下人的楼层
pos = 1
direction = 1
wait_up = set()
wait_down = set()
time = 0
# 处理每个请求
for req in requests:
from_floor, to_floor = map(int, req.split('-'))
# 如果请求的楼层和电梯所在楼层相同,则忽略该请求
if from_floor == pos:
continue
# 根据请求的方向将请求加入等待上下人的楼层集合中
if from_floor > pos:
wait_up.add(from_floor)
else:
wait_down.add(from_floor)
# 模拟电梯的运行过程
while True:
# 计算电梯运行到下一层需要的时间
if direction == 1:
next_time = u
else:
next_time = d
# 如果电梯下一层有等待上下人的请求,则停下来等待
if (pos + direction) in wait_up or (pos + direction) in wait_down:
wait_time = s
time += wait_time
wait_up.discard(pos + direction)
wait_down.discard(pos + direction)
continue
# 如果下方或上方没有请求,则转向运行
if (pos + direction) > n and wait_down:
direction = -1
next_time = d
elif (pos + direction) < 1 and wait_up:
direction = 1
next_time = u
# 更新电梯的位置和时间
pos += direction
time += next_time
# 如果所有请求都已经处理完毕,则退出循环
if not wait_up and not wait_down:
break
return time + s
# 读入数据
cases = []
while True:
try:
n, u, d, s = map(int, input().split())
requests = input().split()
cases.append((n, u, d, s, requests))
except:
break
# 处理每个测试样例
for i, case in enumerate(cases):
n, u, d, s, requests = case
ans = solve(n, u, d, s, requests)
print('Case {}: {}'.format(i+1, ans))
```
注意,在上述代码中,我们使用了Python的集合(set)来记录等待上下人的楼层。当电梯停下来等待上下人时,我们需要从等待集合中删除该楼层,以避免重复等待。另外,需要注意处理一些特殊情况,例如电梯在运行过程中需要转向等。
阅读全文