携程2021年校招笔试题[2021年10月21日19点-21点]

携程2021年校招笔试题[2021年10月21日19点-21点]

试题 2: 排队
时间限制: 3000MS 内存限制: 589824KB
【题目描述】
某办事处有n个窗口可以办理业务,窗口的编号为1到n。会有m个人陆续来办理业务,每个人办理业务所需的时间可能不同。假设每个人来的时候都会选择排队人数最少的窗口排队,如果人数最少的窗口有多个,那么将选择编号最小的进行排队。(如果有空窗口,那么也是选择编号最小的空窗口直接进行业务的办理)
现在告诉你每个人来办事处的时间点以及办理业务所需的时间,问这m个人中最后一个离开办事处的时间点是什么时候?保证每个人到达办事处的时间点都不同。
【输入描述】
第一行有两个正整数n,m,分别表示办事处有n个窗口,会有m个人来办理业务。
第二行有m个数,第i个数t[i]表示第i个人来到办事处的时间点。
第三行有m个数,第i个数c[i]表示第i个人办理业务所需要的时间。
数字间两两有空格隔开。
30%的数据保证n=1,m<=100,1<=t[i],c[i]<=100
60%的数据保证n<=10,m<=100,1<=t[i],c[i]<=200
100%的数据保证n<=100,m<=10000,1<=t[i],c[i]<=20000
【输出描述】
一行,一个整数,表示m个人中最后一个离开办事处的时间点。
【样例输入】
3 5
7 8 4 5 3
7 6 8 8 5
【样例输出】
21
【提示】
样例解释
按照时间点从小到大考虑:
最早来的是第5个人,在时刻3到来,选择了第1个窗口直接办理,需要时长5,将会在时刻8离开。
然后是第3个人,在时刻4到来,此时1窗口有1人,2、3窗口无人,因此选择第2个窗口直接办理,需要时常8,将会在时刻12离开。
接着第4个人在时刻5到来,此时1、2窗口各有1人,3窗口无人,因此选择第3个窗口直接办理,需要时长8,将会在时刻13离开。
接着第1个人在时刻7到来,此时1、2、3窗口各有1人,因此选择第1个窗口排队,需要时长7,而窗口1的前一个人会在时刻8离开,因此他将在时刻8+7=15离开。
接着第2个人在时刻8到来,此时第5个人从窗口1离开了,此时1、2、3窗口各有1人,因此选择第1个窗口排队,需要时长6,该窗口前一个人将在时刻15离开,因此他将在时刻15+6=21离开。
因此最后一个人离开办事处的时间点是21。

我的思路是模拟,一个窗口就是一个队列。首先按照到来的时间进行排序,先到来的人在前面,然后从第一个人开始遍历,记录到来的时间,对所有的队列进行判断,更新到来时刻队列的状态(若队列第一个人走了,则用这个人走的时刻替换他后面一个人到来的时刻),然后选择人数最少的队列,将这个人加入到队列。

代码:Python(变量命名比较随意)

tem = input().split()
n = eval(tem[0])
m = eval(tem[1])
people = []
tem1 = input().split()
tem2 = input().split()
for i in range(m):
    people.append([eval(tem1[i]),eval(tem2[i])])
result = sorted(people)
queue_list = []
for i in range(n):
    queue_list.append([])
for item in result:
    starttime = item[0]
    for i in range(n):
        if(len(queue_list[i])==0):
            continue
        while (True):
            if ((queue_list[i][0][0] + queue_list[i][0][1]) <= starttime):
                tt = queue_list[i].pop(0)
                queue_list[i][0][0]= tt[0]+tt[1]
            else:
                break
    tem_list = []
    for i in range(n):
        tem_list.append(len(queue_list[i]))
    queue_list[tem_list.index(min(tem_list))].append(item)
fin = 0
for i in range(n):
    tem = queue_list[i]
    tem_res = -1
    for item1 in tem:
        if(tem_res == -1):
            tem_res = item1[0]+item1[1]
        else:
            tem_res +=item1[1]

    fin = max(fin,tem_res)
print(fin)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值