预定酒店
知识点排序
时间限制:1s 空间限制:256MB 限定语言:不限
题目描述:
放暑假了,小明决定到某旅游景点游玩,他在网上搜索到了各种价位的酒店(长度为n的数组A),他的心理价位是x元,请帮他筛选出k个最接近x元的酒店(n>=k>0),并由低到高打印酒店的价格。
备注:
1)酒店价格数组A和小明的心理价位x均为整型数据;(0 < n,k,x < 10000)
2)优先选择价格最接近心理价位的酒店;若两家酒店和心理价位差价相同,则选择价格较低的酒店。(比如100元和300元距离心理价位200元同样接近,此时选择100元);
3)酒店价格可能相同重复。
输入描述:
第一行:n, k, x
第二行:A[0] A[1] A[2]…A[n-1]
输出描述:
由低到高打印筛选出的酒店价格
补充说明:
1)酒店价格数组A和小明的心理价位x均为整型数据
2)优先选择价格最接近心理价位的酒店;若两家酒店距离心理价位差价相同,则选择价格较低的酒店。(比如100元和300元距离心理价位200元同样接近,此时选择100元)
3)酒店价格可能相同重复。
示例1
输入:
10 5 6
1 2 3 4 5 6 7 8 9 10
输出:
4 5 6 7 8
说明:
数组长度n = 10,筛选个数k = 5,目标价位x=6
示例2
输入:
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
示例3
输入:
6 3 1000
30 30 200 500 70 300
输出:
200 300 500
解题思路:
1、使用hotel类来记录酒店价格和心理差价
2、根据心理差价,从集合中获取合适的酒店,并按照差价进行降序排序
3、根据k值获取集合中的酒店价格,然后对价格进行升序输出
代码(JAVA):
public class Main{ public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int k = sc.nextInt(); int x = sc.nextInt(); int[] A = new int[n]; List<Hotel> list = new ArrayList<>(); for(int i=0; i<n; i++){ A[i] = sc.nextInt(); Hotel hotel = new Hotel( A[i], Math.abs( A[i] - x)); list.add(hotel); } Collections.sort(list); int[] resInts = new int[k]; for(int i=0; i<k; i++){ resInts[i] = list.get(i).price; } Arrays.sort(resInts); String res = ""; for(int i : resInts){ res += i + " "; } System.out.println(res.substring(0, res.length()-1)); } public static class Hotel implements Comparable<Hotel>{ //酒店价格 public int price; //与心理价格差距 public int difPrice; public Hotel(int price, int difPrice) { this.price = price; this.difPrice = difPrice; } @Override public int compareTo(Hotel hotel) { if(this.difPrice == hotel.difPrice){ return this.price - hotel.price; } return this.difPrice - hotel.difPrice; } } }
满分答案(JAVA):
import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String[] s = sc.nextLine().split(" "); int n = Integer.parseInt(s[0]); int k = Integer.parseInt(s[1]); int x = Integer.parseInt(s[2]); Integer[] integers = Arrays.stream(sc.nextLine().split(" ")).map(Integer::parseInt).toArray(Integer[]::new); ArrayList<int[]> res = new ArrayList<>(); for (int i = 0; i < integers.length; i++) { Integer integer = integers[i]; int[] ints = new int[2]; int abs = Math.abs(integer - x); ints[0] = integer; ints[1] = abs; res.add(ints); } Collections.sort(res, (o1, o2) -> { if (o1[1] == o2[1]) { return o1[0] - o2[0]; } else { return o1[1] - o2[1]; } }); ArrayList<Integer> integers1 = new ArrayList<>(); for (int i = 0; i < k; i++) { int i1 = res.get(i)[0]; integers1.add(i1); } Collections.sort(integers1); StringBuilder sb = new StringBuilder(); for (int i = 0; i < integers1.size(); i++) { sb.append(integers1.get(i)).append(" "); } System.out.println(sb.deleteCharAt(sb.length()-1)); } }
满分答案(JS):
//let input1 = readline().split(" ").map(Number); let input1 = "6 3 1000".split(" ").map(Number); let n = input1[0]; let k = input1[1]; let x = input1[2]; //let integers = readline().split(" ").map(Number); let integers = "30 30 200 500 70 300".split(" ").map(Number); let res = []; for (let i = 0; i < integers.length; i++) { let integer = integers[i]; let ints = []; let abs = Math.abs(integer - x); ints[0] = integer; ints[1] = abs; res.push(ints); } res.sort((o1, o2) => { if (o1[1] == o2[1]) { return o1[0] - o2[0]; } else { return o1[1] - o2[1]; } }); let integers1 = []; for (let i = 0; i < k; i++) { let i1 = res[i][0]; integers1.push(i1); } integers1.sort(); let sb = ""; for (let i = 0; i < integers1.length; i++) { sb += integers1[i] + " "; } console.log(sb.substring(0, sb.length - 1));