链接
题意
给出长度为n的整数序列,求一个整数,要求这个整数到序列中每个整数的距离之和最短,如果有多个这样的数,求最小的那个。
思路
事实上是求中位数,这里可以简单证明一下。
把这n个整数看做已排序好了的:a1, a2, a3, …, an,考虑最外侧的a1和an,在两者之间的整数到它们的距离和就是a1和an的距离,[a1, an]范围外的整数,到二者距离和一定大于a1和an的距离,以此类推,不断向中间缩小范围,最终答案一定是中位数。
代码
#include <cstdio>
#include <algorithm>
#include <iostream>
using namespace std;
#define maxn (300010)
int a[maxn];
int main()
{
int n;
cin >> n;
for(int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
sort(a, a + n);
cout << a[(n - 1) / 2] << endl;
return 0;
}