答疑&&砝码称重

题目

题目描述

有 n 位同学同时找老师答疑。每位同学都预先估计了自己答疑的时间。

老师可以安排答疑的顺序,同学们要依次进入老师办公室答疑。 一位同学答疑的过程如下:

  1. 首先进入办公室,编号为 i 的同学需要 si​ 毫秒的时间。
  2. 然后同学问问题老师解答,编号为 i 的同学需要 ai​ 毫秒的时间。
  3. 答疑完成后,同学很高兴,会在课程群里面发一条消息,需要的时间可 以忽略。
  4. 最后同学收拾东西离开办公室,需要 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值