1 题目及要求
1.1 题目描述
用n个整数组成的序列表示n个同学的身高。定义疯狂值为他们排成一排相邻同学身高差的绝对值的总和。现要求求出该序列的最大疯狂值。
1.2 测试用例
1)n = 5, h = [5, 10, 25, 40, 25]
2)n = 6, h=[1, 2, 3, 4, 5, 6]
2 解答
2.1 题目分析
题意很明了,就是求序列相邻元素间差值总和的最大值。可以用贪心算法求解:
1)先对序列进行排序,排序后为A = [a1, a2, a3, ……, an];
2)然后先拿出最大和最小的元素放在一起作为相邻的元素,记为B,此时:
B = [a1, an]; A = [a2, a3, a4, ……, an-1];
3)拿出A剩下中的最小和最大元素,分别挨着B的两端的最大和最小元素放;此时:
A = [a3, a4, a5,……, an-2],B = [an-1,a1, an, a2]。
4)循环3,直至A为空。
2.2 代码
int maxDiff(vector<int> &h) {
int n(h.size());
if (n < 2) return h[0];
sort(h.begin(), h.end());
int lo(1), hi(n - 2), mx(h[n - 1]), mn(h[0]), ret;
ret = mx - mn;
while (lo < hi) {
ret += mx - h[lo] + (h[hi] - mn);
mx = h[hi];
mn = h[lo];
++lo; --hi;
}
if (lo == hi) ret += max(mx - h[lo], h[lo] - mn);
return ret;
}
3 测试
因为测试简单,这里只给出运行结果:
1)100
2)17