公交上有N排凳子,每排有两个凳子,每一排的凳子宽度不一样。有一些内向和外向的人按照顺序上车。 外向的人(0):只会选择没人的一排坐下,如果有很多排符合要求,他会选择座位宽度最小的坐下。 内向的人(1):只会选择有人的一排坐下,如果有很多排符合要求,他会选择座位宽度最大的坐下。 数据保证存在合理。输出每个人所在的排。
时间: 2024-03-17 07:43:26 浏览: 176
以下是一个可能的解法:
首先,我们需要定义一个数据结构来记录每排凳子的状态,包括是否有人,是否有内向的人,是否有外向的人,以及座位宽度等信息。可以使用一个二维数组来表示,第一维表示排数,第二维表示凳子位置。例如,`seats[i][j]` 表示第 `i` 排第 `j` 个凳子的状态。
然后,我们按照顺序遍历每个上车的人,根据他们的类型和偏好选择合适的座位。可以使用两个指针 `left` 和 `right` 来记录当前可用的一排凳子的左右边界,以及一个布尔变量 `found` 来记录是否已经找到符合要求的座位。
对于外向的人,我们从左到右遍历每排凳子,找到第一个没人的一排,并记录下它的座位宽度。如果后面还有符合要求的一排,就比较座位宽度,选择最小的那排。然后将这排凳子标记为已有外向的人坐下,更新 `left` 和 `right` 的值。
对于内向的人,我们从左到右遍历每排凳子,找到第一个有人的一排,并记录下它的座位宽度。如果后面还有符合要求的一排,就比较座位宽度,选择最大的那排。然后将这排凳子标记为已有内向的人坐下,更新 `left` 和 `right` 的值。
最后,输出每个人所在的排数即可。
以下是 Python 代码实现:
```python
n = int(input())
seats = [[{'occupied': False, 'inward': False, 'outward': False, 'width': int(input())}] * 2 for _ in range(n)]
for i in range(n * 2):
p = int(input()) # 0 for outward, 1 for inward
if p == 0:
found = False
min_width = float('inf')
for j in range(n):
if not seats[j][0]['occupied'] and not seats[j][1]['occupied']:
found = True
if seats[j][0]['width'] < min_width:
row, seat = j, 0
min_width = seats[j][0]['width']
if seats[j][1]['width'] < min_width:
row, seat = j, 1
min_width = seats[j][1]['width']
if not found:
continue
else:
found = False
max_width = -1
for j in range(n):
if seats[j][0]['occupied'] and seats[j][1]['occupied']:
found = True
if seats[j][0]['width'] > max_width:
row, seat = j, 0
max_width = seats[j][0]['width']
if seats[j][1]['width'] > max_width:
row, seat = j, 1
max_width = seats[j][1]['width']
if not found:
continue
seats[row][seat]['occupied'] = True
if p == 0:
seats[row][seat]['outward'] = True
else:
seats[row][seat]['inward'] = True
print(row + 1)
```
其中,输入格式为:
```
N
W_1
W_2
...
W_N
p_1
p_2
...
p_{2N}
```
其中,`N` 表示排数,`W_i` 表示第 `i` 排的座位宽度,`p_i` 表示第 `i` 个上车的人的类型和偏好(0 或 1)。输出格式为每个人所在的排数。
阅读全文