题目
题目描述
有 n 位同学同时找老师答疑。每位同学都预先估计了自己答疑的时间。
老师可以安排答疑的顺序,同学们要依次进入老师办公室答疑。 一位同学答疑的过程如下:
- 首先进入办公室,编号为 i 的同学需要 si 毫秒的时间。
- 然后同学问问题老师解答,编号为 i 的同学需要 ai 毫秒的时间。
- 答疑完成后,同学很高兴,会在课程群里面发一条消息,需要的时间可 以忽略。
- 最后同学收拾东西离开办公室,需要 ei 毫秒的时间。一般需要 10 秒、20 秒或 30秒,即 ei 取值为 10000,20000 或 30000。
一位同学离开办公室后,紧接着下一位同学就可以进入办公室了。
答疑从 0时刻开始。老师想合理的安排答疑的顺序,使得同学们在课程群 里面发消息的时刻之和最小。
思路
最开始以为是将收拾书包最快的同学排在前面答疑,结果发现这样算出来跟给的例子答案不一致。后面才知道是总时间最短的放在前面,因为越在前面的同学,后面同学发消息时间都会加上前面同学所用掉的时间。
代码
import os
import sys
# 请在此输入您的代码
# 总耗时最短的优先进行答疑,这样得到的总时间就是最少的,因为后面同学答疑的时间都要加上前面同学的总时间
n = int(input())
add= {} # 存储每个同学所需的总时间和该同学的编号 用于后续根据编号查找该同学各个部分所用时间
s = [ 0 for i in range(n)]
a = [ 0 for i in range(n)]
e = [ 0 for i in range(n)]
for i in range(n):
s[i], a[i], e[i] = map(int, input().split())
add[i] = s[i] + a[i] + e[i]
add = dict(sorted(add.items(), key = lambda x:x[1])) # 根据value的值对字典进行排序
time = [] # 存储每个同学发消息的时刻
values = 0
for key, value in add.items(): # 遍历字典
time.append(values + value - e[key]) # 当前同学发消息的时刻 = 该同学前面所有同学所需时间总和 + 该同学所需时间总和 - 该同学收拾书包的时间
values += value #记录之前同学用的所有时间
print(sum(time))
题目
你有一架天平和 N 个砝码,这 N 个砝码重量依次是 1,2,⋅⋅⋅,W1,W2,⋅⋅⋅,WN。
请你计算一共可以称出多少种不同的重量? 注意砝码可以放在天平两边。
思路
最开始还准备用之前字符串的combinations,然后对不同的组合进行加减,但是发现这样代码写不出来。就去看题解了,代码非常的优雅。
代码
import os
import sys
# 请在此输入您的代码
n = int(input())
w = list(map(int, input().split()))
set_w = set()
set_w.add(0) # 0表示 一边使用单个砝码的结果
for i in w:
for j in list(set_w): # 在上一次结果的集合中循环
set_w.add(i+j) # 砝码放一边
set_w.add(abs(i-j)) # 砝码放两边
print(len(set_w) - 1) # 最后结果减去0