2024华为OD试题及答案-A050-预订酒店

题目描述

放暑假了,小明决定到某旅游景点游玩,他在网上搜索到了各种价位的酒店(长度为n的数组A),他的心理价位是x元,请帮他筛选出k个最接近x元的酒店(n>=k>0),并由低到高打印酒店的价格。

输入描述

第一行:n, k, x
第二行:A[0] A[1] A[2]…A[n-1]

输出描述

从低到高打印筛选出的酒店价格

备注
  1. 酒店价格数组A和小明的心理价位x均为整型数据
  2. 优先选择价格最接近心理价位的酒店,若两家酒店距离心理价位差价相同,则选择价格较低的酒店。(比如100元和300元距离心理价位200元同样接近,此时选择100元)
  3. 酒店价格可能相同重复

用例
输入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
说明
输入6 3 1000
30 30 200 500 70 300
输出200 300 500
说明

解题思路

题目要求从一个酒店价格数组中找到距离心理价位 xxx 最近的 kkk 个酒店,并按价格从低到高输出。我们可以按以下步骤实现:

  1. 读取输入的 nnn、kkk、xxx 以及酒店价格数组 AAA。
  2. 计算每个酒店价格与心理价位 xxx 的差值,并将酒店价格和差值存储在一个数组中。
  3. 按照差值从小到大排序,如果差值相同则按价格从低到高排序。
  4. 取前 kkk 个酒店价格,按价格从低到高排序输出。

C++程序

 
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    int n, k, x;
    cin >> n >> k >> x;
    
    vector<int> prices(n);
    for (int i = 0; i < n; ++i) {
        cin >> prices[i];
    }

    vector<pair<int, int>> diffs;
    for (int i = 0; i < n; ++i) {
        diffs.push_back({abs(prices[i] - x), prices[i]});
    }

    sort(diffs.begin(), diffs.end(), [](const pair<int, int>& a, const pair<int, int>& b) {
        if (a.first != b.first)
            return a.first < b.first;
        return a.second < b.second;
    });

    vector<int> result;
    for (int i = 0; i < k; ++i) {
        result.push_back(diffs[i].second);
    }

    sort(result.begin(), result.end());

    for (int i = 0; i < k; ++i) {
        cout << result[i];
        if (i < k - 1) cout << " ";
    }
    cout << endl;

    return 0;
}

Python程序

 
def find_top_k_hotels(n, k, x, prices):
    diffs = [(abs(price - x), price) for price in prices]
    diffs.sort(key=lambda pair: (pair[0], pair[1]))

    top_k_prices = [diffs[i][1] for i in range(k)]
    top_k_prices.sort()

    return top_k_prices

# 输入
n, k, x = map(int, input().split())
prices = list(map(int, input().split()))

# 找到最近的k个酒店价格并输出
result = find_top_k_hotels(n, k, x, prices)
print(" ".join(map(str, result)))

用例验证

输入
 
5 3 10
12 15 10 9 11

输出
 
9 10 11

解释:距离心理价位10最近的3个价格是9、10、11,按价格从低到高排序。

以上代码可以通过给定的用例验证。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值