问题描述:
1. 一辆公交有 N 排座椅(有次序),一排座椅有两个座位,那一辆公交就有 2N 个座位。
2. 有两类人上车,且坐满座位,所以会有 N 个内向的人,N 个外向的人:
0->内向的人-->上车后找没人的,且座椅最小的位置坐下;
1->外向的人-->上车后找有人的,且座椅最大的位置坐下;
3. 输出结果,依据上车次序,给出每个人的座椅排号。
举例:
- 座椅数量 N=3 且大小为 [10, 5, 20] ,座位数量为 2N=6
- 上车顺序为 [0,0,1,1,0,1]
- 输出结果为每个人的座椅排号:[2,1,1,2,3,3]
程序脚本:
# 座椅类
class BusSeat:
def __init__(self, width, isperson, seatindex):
self.width = width
self.isperson = isperson
self.seatindex = seatindex
# 核心算法
def GongjiaoSeats(bs,str):
seats = []
# 给bs排序->升序
# 借助选择排序,完成初始座位的升序排序
for i in range(len(bs)):
minindex = i
for j in range(i+1,len(bs)):
if bs[j].width < bs[minindex].width:
minindex = j
bs[i],bs[minindex]=bs[minindex],bs[i]
print('=='*20)
for i in bs:
print(i.width,i.isperson,i.seatindex)
print('@'*50)
# 找座位
for i in range(len(str)):
if str[i]==0: #内向的人,选择无人,且宽度小的座位
for j in range(len(bs)): # 正向索引
if bs[j].isperson==0: # 当前排座椅是否已经有人: 0->没人,1->一个人,2->两个人
seats.append(bs[j].seatindex)
bs[j].isperson=1
bs[j+1].isperson=1
break
pass
if str[i]==1: #外向的人,选择有人,且宽度大的座位
for j in range(len(bs)-1,-1,-1): # 反向索引
if bs[j].isperson==1: # 当前排座椅是否已经有人: 0->没人,1->一个人,2->两个人
seats.append(bs[j].seatindex)
bs[j].isperson=2
bs[j-1].isperson=2
break
pass
print('指定的座椅顺序:', seats)
# 程序主体:
bs = []
bslist = [10, 5, 20,2,50]
str = [0,0,1,1,0,1,0,0,1,1]
# 初始化座椅编号:
for i in range(len(bslist)):
bs.append(BusSeat(bslist[i],0,i+1))
bs.append(BusSeat(bslist[i],0,i+1))
print('*'*50)
for i in bs:
print(i.width,i.isperson,i.seatindex)
print('*'*50)
GongjiaoSeats(bs,str)