이 문제는 규칙이 있다.
첫 번째 테스트 케이스를 정렬해서 보면
13 12 12 11 11 10 10 이 된다.
1. 큰 것부터 하칸씩 자리를 비우며 재배치 한다.
13 X 12 X 12 X 11
2. 남은 빈칸에도 큰것부터 다시 배치한다.
12 11 12 10 12 10 11
이런 식으로 배치하는 것이 두 기둥간 차이를 최소로 가지게 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | #include <stdio.h> #include <algorithm> #include <vector> #include <stdlib.h> using namespace std; int main() { int T; setbuf(stdout, NULL); scanf("%d", &T); for (int test_case = 1; test_case <= T; test_case++) { int n; scanf("%d", &n); vector<int> v; for (int i = 0; i < n; i++) { int t; scanf("%d", &t); v.push_back(t); } sort(v.begin(), v.end()); vector<int> ans; auto it = v.begin(); for (int i = 0; i < n; i += 2) { ans.push_back((*it)); if(it!=v.end()) it++; if (it != v.end()) it++; } if (n % 2 == 0) it = v.end() - 1; else { it = v.end() - 1; it--; } for (int i = 1; i < n; i += 2) { ans.push_back((*it)); if(it!=v.begin()) it--; if (it != v.begin()) it--; } ans.push_back(v[0]); int max = 0; for (int i=1;i<=n;i++) { if (abs(ans[i] - ans[i - 1]) > max) { max = abs(ans[i] - ans[i - 1]); } } printf("#%d %d\n", test_case, max); } return 0; } | cs |