青蛙过河数位排序
题目
青蛙住在一条河边, 它想到河对岸的学校去学习。小青蛙打算经过河里 的石头跳到对岸。
河里的石头排成了一条直线, 小青蛙每次跳跃必须落在一块石头或者岸上。 不过, 每块石头有一个高度, 每次小青蛙从一块石头起跳, 这块石头的高度就 会下降 1 , 当石头的高度下降到 0 时小青蛙不能再跳到这块石头上(某次跳跃 后使石头高度下降到 0 是允许的)。
小青蛙一共需要去学校上 x 天课, 所以它需要往返 2x 次。当小青蛙具有 一个跳跃能力 y 时, 它能跳不超过 y 的距离。
请问小青蛙的跳跃能力至少是多少才能用这些石头上完 x 次课。
输入格式
输入的第一行包含两个整数n,x, 分别表示河的宽度和小青蛙需要去学校 的天数。请注意 2x 才是实际过河的次数。
第二行包含 n−1 个非负整数H1,H2,⋯,Hn−1, 其中 Hi>0 表示在河中与 小青蛙的家相距i 的地方有一块高度为 Hi 的石头, Hi=0 表示这个位置没有石头。
输出格式
输出一行, 包含一个整数, 表示小青蛙需要的最低跳跃能力。
思路
直接一点不会,看了题解。判断当前跳跃能力是否可以满足上2x的关键是,在任何跳跃范围内的石头高度要大于2x(这个点比较巧妙)。这样就能用二分法去查找合适的跳跃能力。
代码
import os
import sys# 请在此输入您的代码
n, x = map(int, input().split())
H = list(map(int, input().split()))
sum_H = [0]*n #用来记录H数组的前缀和 sum_H[0] = 0for i in range(1, n):sum_H[i] = sum_H[i-1] + H[i-1]def chek(y):for i in range(n-y): # 其实这里为啥是n-y我不是很懂if sum_H[i+y] - sum_H[i] < 2*x:return Falsereturn Truel, r = 1, n # 跳跃能力在1-n之间
res = -1
while l <= r: # 二分法的停止条件mid = (r + l) //2if chek(mid): # 当前跳跃能力满足 但不一定是最小的res = midr = mid - 1else:l = mid + 1 # 当前跳跃能力太小了 不满足要求
print(res)
题目
小蓝对一个数的数位之和很感兴趣, 今天他要按照数位之和给数排序。当 两个数各个数位之和不同时, 将数位和较小的排在前面, 当数位之和相等时, 将数值小的排在前面。
例如, 2022 排在 409 前面, 因为 2022 的数位之和是 6, 小于 409 的数位 之和 13 。
又如, 6 排在 2022 前面, 因为它们的数位之和相同, 而 6 小于 2022 。
给定正整数 n,m, 请问对 1 到 n 采用这种方法排序时, 排在第 m 个的元 素是多少?
思路
最开始想的是一个个去找,但是这样写出来只有两个测试用例通过,不知道为啥。感觉其他测试用例最多也只是超时吧 不知道咋出现了答案错误。看了一下题解,别人几行就解决了,好厉害!
代码
——通过2个 不知道错在哪 提交显示是答案错误?
import os
import sys# 请在此输入您的代码
n = input()
m = int(input())num_n = sum(int(x) for x in n)
i = 1
sorted_mun = []
flag = Truewhile i < m:sorted_mun.append(i)#print("here1:", i)if len(sorted_mun) == m:flag = Falsebreakfor j in range(1, i+1):temp = i - jx = int(str(j) + str(temp))if x <= int(n):#print("here2:", x)sorted_mun.append(x)if len(sorted_mun) == m:flag = Falsebreakelse:breakwhile x*10 <= int(n):x = int(str(x) + '0')#print("here3:", x)sorted_mun.append(x)if len(sorted_mun) == m:flag = Falsebreaki += 1if flag == False:breakprint(sorted_mun[-1])
别人的代码
import os
import sys# 请在此输入您的代码
n = int(input())
m = int(input())num = [i for i in range(1, n+1)]
num.sort(key = lambda X:sum(int(i) for i in str(X)))
print(num[m-1])
Tips
list.sort(key = )可以自己定义排序的规则