题目描述
放暑假了,小明决定到某旅游景点游玩,他在网上搜索到了各种价位的酒店(长度为n的数组A),他的心理价位是x元,请帮他筛选出k个最接近x元的酒店(n>=k>0),并由低到高打印酒店的价格。
输入描述
第一行:n, k, x
第二行:A[0] A[1] A[2]…A[n-1]
输出描述
从低到高打印筛选出的酒店价格
备注
- 酒店价格数组A和小明的心理价位x均为整型数据
- 优先选择价格最接近心理价位的酒店,若两家酒店距离心理价位差价相同,则选择价格较低的酒店。(比如100元和300元距离心理价位200元同样接近,此时选择100元)
- 酒店价格可能相同重复
用例
输入 | 10 5 6 1 2 3 4 5 6 7 8 9 10 |
输出 | 4 5 6 7 8 |
说明 | 无 |
输入 | 10 4 6 |
输出 | 4 5 6 7 |
说明 | 无 |
输入 | 6 3 1000 30 30 200 500 70 300 |
输出 | 200 300 500 |
说明 | 无 |
解题思路
题目要求从一个酒店价格数组中找到距离心理价位 xxx 最近的 kkk 个酒店,并按价格从低到高输出。我们可以按以下步骤实现:
- 读取输入的 nnn、kkk、xxx 以及酒店价格数组 AAA。
- 计算每个酒店价格与心理价位 xxx 的差值,并将酒店价格和差值存储在一个数组中。
- 按照差值从小到大排序,如果差值相同则按价格从低到高排序。
- 取前 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,按价格从低到高排序。
以上代码可以通过给定的用例验证。