HDU-2083: 中位数

问题描述

寒假时,ACBOY要去拜访许多朋友。恰巧他所有朋友的家都在平面坐标的X轴上。ACBOY可以选择任意一个朋友的家出发访问,但每次访问结束都要回到出发点。ACBOY怎么走花费时间最少?

输入

输入首先是一个正整数 M,表示 M 个测试实例。每个实例的输入有两行,首先是一个正整数 N (N <= 500),表示有 N 个朋友,下一行是 N 个正整数,表示在X轴上的具体坐标。所有数据均小于 100000。

输出

对于每一个输入实例,输出访问完所有朋友的最小时间。回程时间不计。每个输出占一行。

样例

Input计

2
2
2 4
3
2 4 6

Output

2
4

分析

任意选取 N 点序列内部的一点。将两边的点自远到近一一对应得到线段或单个点,易知线段数量最大时的点 N 为最佳出发点。故应选取序列的中位数。

AC代码

#include
#include
#include
#include
using namespace std;
int main() {
    int T; cin >> T; while (T--) {
        int N; cin >> N;
        vector v;
        while (N--) {
            int tmp; cin >> tmp;
            v.push_back(tmp);
        }
        sort(v.begin(), v.end());
        int mid{*(v.begin() + (v.end() - v.begin()) / 2)};
        int sum{0}; for (int n : v) sum += abs(n - mid);
        cout << sum << '\n';
    }
}

你可能感兴趣的:(HDU-2083: 中位数)