青蛙过河&&数位排序

题目

青蛙住在一条河边, 它想到河对岸的学校去学习。小青蛙打算经过河里 的石头跳到对岸。

河里的石头排成了一条直线, 小青蛙每次跳跃必须落在一块石头或者岸上。 不过, 每块石头有一个高度, 每次小青蛙从一块石头起跳, 这块石头的高度就 会下降 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] = 0

for 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 False
  return True

l, r = 1, n  # 跳跃能力在1-n之间
res = -1
while l <= r: # 二分法的停止条件
  mid = (r + l) //2
  if chek(mid): # 当前跳跃能力满足 但不一定是最小的
    res = mid
    r = mid - 1
  else:
    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 = True

while i < m:
  sorted_mun.append(i)
  #print("here1:", i)
  if len(sorted_mun) == m:
    flag = False
    break
  for j in range(1, i+1):
    temp = i - j
    x = int(str(j) + str(temp))
    if x <= int(n):
      #print("here2:", x)
      sorted_mun.append(x)
      if len(sorted_mun) == m:
        flag = False
        break
    else:
      break
  while x*10 <= int(n):
    x = int(str(x) + '0')
    #print("here3:", x)
    sorted_mun.append(x)
    if len(sorted_mun) == m:
        flag = False
        break
  i += 1

  if flag == False:
    break

print(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 = )可以自己定义排序的规则

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值