小明找位置
题目描述
小朋友出操,按学号从小到大排成一列;小明来迟了,请你给小明出个主意,让他尽快找到他应该排的位置。
算法复杂度要求不高于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和从根节点到当前节点的值之和sum
if u>=n or w[u]==-1: # 如果节点索引超出范围或节点值为-1(表示叶节点),则返回
return
global res # 使用全局变量res
res=max(res,sum+w[u]) # 更新res为其当前值和sum加上当前节点值的最大值
dfs(u*2,sum+w[u]) # 递归调用dfs函数,传入左子节点和更新后的sum
dfs(u*2+1,sum+w[u]) # 递归调用dfs函数,传入右子节点和更新后的sum
dfs(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:
continue
apps.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.name
break
print(ans) # 输出结果