王国有 n 个勇士,他们的能力值使用整数数组 arr 表示,现在国王想要召集 k 个能力值最强的勇士。判断能力值强弱的规则如下: 设 m 为数组的中位数,只要满足下述两个前提之一,就可以判定 arr[i] 的 值比 arr[j] 的值更强: |arr[i] - m| > |arr[j] - m| |arr[i] - m| == |arr[j] - m|,且 arr[i] > arr[j] 中位数是一个有序整数列表中处于中间位置的值。形式上,如果列表的长度 为 n ,那么中位数就是该有序列表(下标从 0 开始)中位于 ((n - 1) / 2) 的 元素。 请你使用编码的方式帮助国王找到王国中最强的 k 个勇士的能力值组成的 序列。答案按照降序返回。
第一行输入整数 n 和 k,分别表示王国勇士总人数和要查找的 k 个勇士。第 二行输入数组 arr 的值,表示勇士的能力值,arr[i]表示第 i 个勇士的能力值。
输出一个降序序列,表示前 k 个最强能力值。
5 2 1 2 3 4 5
5 1
6 5 6 7 11 7 6 8
11 8 6 6 7 样例解释: 样例 1 中,中位数为 3,按从强到弱顺序排序后,数组变为 [5,1,4,2,3]。 最强的两个元素是 [5, 1]。注意,尽管 |5 - 3| == |1 - 3| ,但是 5 比 1 更 强,因为 5 > 1 。 样例 2 中,中位数为 7, 按从强到弱顺序排序后,数组变为 [11,8,6,6,7,7]。 [11,8,6,6,7] 是前 5 个最强能力值。
1<=k<=n<=1000; 1<=arr[i]<=1000
#include<bits/stdc++.h>
using namespace std;
int n,k,m,arr[1005],a[1005];
bool cmp(int a,int b){
if(abs(a-m)!=abs(b-m))return abs(a-m)>abs(b-m);
return a>b;
}
bool cmp2(int a,int b){
return a>b;
}
int main() {
//freopen("number.in","r",stdin);
//freopen("number.ans","w",stdout);
cin>>n>>k;
for (int i=0;i<n;i++){
cin>>arr[i];
}
m=arr[(n-1)/2];
sort(arr,arr+n,cmp);
for (int i=0;i<k;i++){
a[i]=arr[i];
}
sort(a,a+k,cmp2);
for(int i=0;i<k;i++){
cout<<a[i]<<" ";
}
return 0;
}