赞
踩
这道题思维。
题目大意:给你一个序列,让你对这个序列重新排列,输出一个序列满足下列要求:
|a1−a2|≤|a2−a3|≤…≤|an−1−an|
思路:我们把这个序列sort一下,之后从中间开始,双指针右左分别输出就行啦~
这样可以保证后面相减的差大于前面相减的差。
为啥?画一下图就知道了。
emmm图画的丝丝丑。。
不过还是可以看清楚的!
代码部分:
#include <bits/stdc++.h> using namespace std; const int N = 1e5 + 10; int t; int n; int a[N]; int main() { cin >> t; while (t--) { scanf ("%d", &n); for (int i = 1; i <= n; i++) { scanf ("%d", &a[i]); } sort(a + 1, a + n + 1); int l = n / 2, r = n / 2 + 1; for (; l >= 1 && r <= n; l--, r++) { cout << a[r] << " " << a[l] << " "; } if (n & 1) { cout << a[n]; } cout << endl; } return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。