题目描述:
工位由序列F1,F2...Fn组成,Fi值为0、1或2。其中0代表空置,1代表有人,2代表障碍物。
1、某一空位的友好度为左右连续老员工数之和
2、为方便新员工学习求助,优先安排友好度高的空位
给出工位序列,求所有空位中友好度的最大值。
输入描述:
第一行为工位序列:F1,F2...Fn组成,1<=n<=100000,Fi值为0、1或2。其中0代表空置,1代码有人,2代表障碍物
其中0代表空置,1代码有人,2代表障碍物。
输出描述:
所有空位中友好度的最大值。如果没有空位,返回0。
示例1
输入:
0 1 0
输出:
1
说明:
第1个位置和第3个位置,友好度均为1
示例2
输入:
1 1 0 1 2 1 0
输出:
3
说明:
第3个位置友好度为3。因障碍物隔断,左边得2分,右边只能得1分。
解题思路:
思路是首先遍历座位表,如果存在老员工,则统计数量,如果遇到空位,则向新列表队尾添加0,如果遇到障碍,则添加-1
然后遍历新列表,每遇到一个空位,计算其左右的老员工数。
逻辑判断嵌套太多,写得糊涂了,代码很丑陋,理解思路就好
#华为机试,emo了#
lst=list(map(int,input().split()))
new_lst=[]
pre_seat=0
count=0
for i,value in enumerate(lst):
if pre_seat==0 or pre_seat==2:
if value==1:
count+=1
if i==len(lst)-1:
new_lst.append(count)
elif value==0:
new_lst.append(0)
else:
new_lst.append(-1)
else:
if value == 1:
count += 1
if i==len(lst)-1:
new_lst.append(count)
elif value == 0:
new_lst.append(count)
count=0
new_lst.append(0)
else:
new_lst.append(count)
count=0
new_lst.append(-1)
pre_seat=value
max_fri=0
for i,value in enumerate(new_lst):
if value==0:
if i==0:
left=0
if new_lst[i+1]==0 or new_lst[i+1]==-1:
right=0
else:
right=new_lst[i+1]
elif i==len(new_lst)-1:
right=0
if new_lst[i-1]==0 or new_lst[i-1]==-1:
left=0
else:
left=new_lst[i-1]
else:
if new_lst[i-1]==0 or new_lst[i-1]==-1:
left=0
if new_lst[i + 1] == 0 or new_lst[i + 1] == -1:
right = 0
else:
right = new_lst[i + 1]
else:
left=new_lst[i-1]
if new_lst[i + 1] == 0 or new_lst[i + 1] == -1:
right = 0
else:
right = new_lst[i + 1]
max_fri=max(max_fri,left+right)
print(max_fri)