预订酒店算法问题

算法题目

放暑假的时候,小明打算去某旅游景点游玩。他在网上搜索到了不同价位的酒店,这些酒店的价格用一个长度为 n 的数组 A 来表示。小明心里有一个理想的价位 x 元,现在需要你帮他从搜索到的酒店中筛选出 k 个最接近 x 元的酒店,并且要把这些酒店的价格按照从低到高的顺序打印出来。

输入描述如下:
第一行包含三个整数 nkx。其中,n 代表在网上搜索到的酒店数量,x 是小明的心理价位,k 是要筛选出的最接近心理价位的酒店个数。
第二行是 n 个酒店的价格,用数组 A[0] A[1] A[2]...A[n - 1] 表示。

输出描述为:按照从低到高的顺序输出筛选出的酒店价格。

示例如下:
示例一:
输入:

10 5 6
1 2 3 4 5 6 7 8 9 10

输出:

4 5 6 7 8

示例二:
输入:

10 4 6
10 9 8 7 6 5 4 3 2 1

输出:

4 5 6 7

说明:数组长度 n = 10,筛选个数 k = 4,目标价位 x = 6。当 4 和 8 距离 x 相同时,优先选择价格低的 4。

示例三:
输入:

6 3 1000
30 30 200 500 70 300

输出:

200 300 500

备注:

  1. 酒店价格数组 A 和小明的心理价位 x 都是整型数据,它们的取值范围是 0 < n, k, x < 10000。
  2. 优先选择价格最接近心理价位的酒店。如果有两家酒店和心理价位的差价相同,那么选择价格较低的酒店。例如,100 元和 300 元距离心理价位 200 元同样接近,此时应选择 100 元。
  3. 酒店价格可能会出现相同重复的情况。

解题思路

要解决这个问题,我们可以按照以下步骤进行:

  1. 首先,计算每个酒店价格与心理价位的距离。为了方便后续处理,我们把每个酒店价格和它与心理价位的距离组合成一个元组,存储在数组 near_prices 中。例如,对于价格为 50 元,心理价位为 60 元的情况,元组就是 (50, 10),其中 10 是 50 与 60 的距离。
  2. 接着,对 near_prices 数组进行排序。排序的规则是先按照距离从小到大排序,如果距离相同,再按照价格从小到大排序。这样可以保证我们优先选择距离心理价位近且价格低的酒店。
  3. 然后,从排序好的 near_prices 数组中取出前 k 个元素,这些元素对应的酒店价格就是最接近心理价位的。
  4. 最后,对取出的这 k 个酒店价格进行排序,使其按照从低到高的顺序排列,再将排序后的结果返回。

示例代码

def solve_method(k, x, prices):
    near_prices = []

    # 计算各个价格与心理价位的距离
    for p in prices:
        near_prices.append((p, abs(p - x)))

    # 按照距离从小到大排序,距离相同时,按照价格从小到大排序
    near_prices.sort(key=lambda x: (x[1], x[0]))

    # 取前k个与心理价位最近的酒店价格
    ans = list(map(lambda x: x[0], near_prices[:k]))
    ans.sort()

    return ans


if __name__ == '__main__':
    assert solve_method(5, 6, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) == [4, 5, 6, 7, 8]
    assert solve_method(4, 6, [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]) == [4, 5, 6, 7]
    assert solve_method(3, 1000, [30, 30, 200, 500, 70, 300]) == [200, 300, 500]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

t0_54coder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值