答疑

答疑

题目介绍

有 n 位同学同时找老师答疑。每位同学都预先估计了自己答疑的时间。 老师可以安排答疑的顺序,同学们要依次进入老师办公室答疑。 一位同学答疑的过程如下:

  1. 首先进入办公室,编号为 i 的同学需要 si 毫秒的时间。
  2. 然后同学问问题老师解答,编号为 i 的同学需要 ai 毫秒的时间。
  3. 答疑完成后,同学很高兴,会在课程群里面发一条消息,需要的时间可 以忽略。
  4. 最后同学收拾东西离开办公室,需要 ei 毫秒的时间。一般需要 10 秒、 20 秒或 30 秒,即 ei 取值为 10000,20000 或 30000。 一位同学离开办公室后,紧接着下一位同学就可以进入办公室了。 答疑从 0 时刻开始。老师想合理的安排答疑的顺序,使得同学们在课程群 里面发消息的时刻之和最小。

【输入格式】

输入第一行包含一个整数 n,表示同学的数量。 接下来 n 行,描述每位同学的时间。其中第 i 行包含三个整数 si, ai, ei,意义如上所述。

【输出格式】

输出一个整数,表示同学们在课程群里面发消息的时刻之和最小是多少。

【样例输入】

3 10000 10000 10000 20000 50000 20000 30000 20000 30000

【样例输出】

280000 280000280000

思路

同学消耗的总时间越短,优先级越高 总时间相等时,优先级相同,无所谓前后

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# s1 a1 |A1| e1 s2 a2 |(A1+e1+A2)| e2 s3 a3 |(A1+e1+A2+e2+A3)|(A1+e1+A2+e2+A3+e3+A4)
n=int(input())
li=[]
for i in range(n):
lis=list(map(int,input().split(" ")))
li.append((lis,sum(lis)))
li.sort(key= lambda x:x[1])
A_li=[]
E_li=[]
for i in li:#i->([10000, 10000, 10000], 30000)
A_li.append(i[0][0]+i[0][1])
E_li.append(i[0][2])
temp=[A_li[0]]
for i in range(1,len(li)):
c=A_li[i]
for j in range(i):
c+=A_li[j]+E_li[j]
temp.append(c)
print(sum(temp))

排队接水

题目描述

有n 个人在一个水龙头前排队接水,假如每个人接水的时间为Ti,请编程找出这 n 个人排队的一种顺序,使得 n 个人的平均等待时间最小。

输入格式

第一行为一个整数 n。

第二行 n个整数,第 i 个整数 Ti第 i个人的接水时间 Ti。

输出格式

输出文件有两行,第一行为一种平均时间最短的排队顺序;第二行为这种排列方案下的平均等待时间(输出结果精确到小数点后两位)。

样例 #1

样例输入 #1

1
2
10 
56 12 1 99 1000 234 33 55 99 812

样例输出 #1

1
2
3 2 7 8 1 4 9 6 10 5
291.90

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
n=int(input())
li1=list(map(int,input().split(" ")))
li=[]
for i in range(len(li1)):
li.append((li1[i],i))
li.sort(key= lambda x:x[0])
order=[]
for i in li:
order.append(i[1]+1)
print(' '.join(map(str,order)))
wite_time=[]
for i in range(len(li)):
a=0
for j in range(i):
a+=li[j][0]
wite_time.append(a)
print("%.2f" % (sum(wite_time)/n))

答疑
https://ianwusb.blog/2024/03/06/答疑/
作者
Ianwusb
发布于
2024年3月6日
许可协议