小明找位置
题目描述
小朋友出操,按学号从小到大排成一列;小明来迟了,请你给小明出个主意,让他尽快找到他应该排的位置。
算法复杂度要求不高于nLog(n);学号为整数类型,队列规模<=10000;
输入描述
1、第一行:输入已排成队列的小朋友的学号 (正整数),以”,”隔开
例如: 93,95,97,100,102,123,155 2、第二行:小明学号,如110;
输出描述
输出一个数字,代表队列位置 (从1开始)例如: 6
用例
输入93,95,97,100,102,123,155
110输出6
import bisect
arr = list(map(int, input().split()))
x = int(input())
idx = bisect.bisect_left(arr, x)
print(idx + 1)
传递悄悄话
w=[0]+list(map(int,input().split())) # 从输入中读取一个整数列表,并在列表开头添加一个0
n=len(w) # 获取列表的长度
res=0 # 初始化一个变量来存储最大和def dfs(u,sum): # 定义一个函数dfs,它接受两个参数:一个节点索引u和从根节点到当前节点的值之和sumif u>=n or w[u]==-1: # 如果节点索引超出范围或节点值为-1(表示叶节点),则返回returnglobal res # 使用全局变量resres=max(res,sum+w[u]) # 更新res为其当前值和sum加上当前节点值的最大值dfs(u*2,sum+w[u]) # 递归调用dfs函数,传入左子节点和更新后的sumdfs(u*2+1,sum+w[u]) # 递归调用dfs函数,传入右子节点和更新后的sumdfs(1,0) # 以初始和为0调用dfs函数,传入根节点
print(res) # 打印最大和
手机App防沉迷系统
class App:def __init__(self, name, p, start, end):self.name = name # 应用名称self.p = p # 优先级self.start = start # 开始时间self.end = end # 结束时间def trans_to(data):arr = data.split(":")hour = int(arr[0]) # 小时部分minute = int(arr[1]) # 分钟部分return hour * 60 + minute # 将时间转换为分钟表示def trans_to_app(s):arr = s.split(" ")name = arr[0] # 应用名称p = int(arr[1]) # 优先级start = trans_to(arr[2]) # 开始时间end = trans_to(arr[3]) # 结束时间return App(name, p, start, end)n = int(input()) # 输入应用的数量
apps = []# 读取每个应用的信息
for i in range(n):s = input()temp = trans_to_app(s)# 如果开始时间晚于结束时间,忽略该应用if temp.start > temp.end:continueapps.append(temp)res = []# 遍历每个应用
for i in range(len(apps)):ids = []# 找到与当前应用时间段有重叠的应用for j in range(len(res)):if res[j].start <= apps[i].end and apps[i].start <= res[j].end:ids.append(j)mx = -1# 找到重叠应用中优先级最高的for j in ids:mx = max(mx, res[j].p)# 如果当前应用优先级更高,则移除重叠应用,添加当前应用if mx < apps[i].p:for j in reversed(ids):res.pop(j)res.append(apps[i])time = trans_to(input()) # 输入时间
ans = "NA"# 查找当前时间所在的应用
for app in res:if app.start <= time and time <= app.end:ans = app.namebreakprint(ans) # 输出结果