Submission
Status:
P-PP-PP--P
Subtask/Task Score:
60/100
Score: 60
User: chokun
Problemset: ประลอง
Language: cpp
Time: 0.005 second
Submitted On: 2026-10-14 19:40:25
#include <bits/stdc++.h>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n;
if (!(cin >> n)) return 0;
vector<int> arr(n);
int min_possible = 0;
int max_possible = 0;
int total_sum = 0;
for (int i = 0; i < n; i++) {
cin >> arr[i];
total_sum += arr[i];
if (arr[i] < 0) min_possible += arr[i];
else max_possible += arr[i];
}
int k1 = n / 2;
int k2 = (n + 1) / 2;
int max_k = k2;
int offset = -min_possible;
int S_range = max_possible - min_possible + 1;
int dim2 = max_k + 1;
int dim3 = S_range;
auto get_idx = [&](int i, int j, int s) {
return i * (dim2 * dim3) + j * dim3 + s;
};
vector<bool> dp((n + 1) * dim2 * dim3, false);
dp[get_idx(0, 0, offset)] = true; // จุดเริ่มต้น
for (int i = 0; i < n; i++) {
int x = arr[i];
for (int j = 0; j <= max_k; j++) {
for (int s = 0; s < S_range; s++) {
if (dp[get_idx(i, j, s)]) {
dp[get_idx(i + 1, j, s)] = true;
if (j + 1 <= max_k && s + x >= 0 && s + x < S_range) {
dp[get_idx(i + 1, j + 1, s + x)] = true;
}
}
}
}
}
int best_diff = 2e9;
int best_k = k1;
int best_sum_idx = offset;
for (int s = 0; s < S_range; s++) {
if (dp[get_idx(n, k1, s)]) {
int actual_sum = s - offset;
int diff = abs(2 * actual_sum - total_sum);
if (diff < best_diff) {
best_diff = diff;
best_k = k1;
best_sum_idx = s;
}
}
}
if (k1 != k2) {
for (int s = 0; s < S_range; s++) {
if (dp[get_idx(n, k2, s)]) {
int actual_sum = s - offset;
int diff = abs(2 * actual_sum - total_sum);
if (diff < best_diff) {
best_diff = diff;
best_k = k2;
best_sum_idx = s;
}
}
}
}
int curr_j = best_k;
int curr_s = best_sum_idx;
vector<bool> in_team1(n, false);
for (int i = n - 1; i >= 0; i--) {
int x = arr[i];
if (dp[get_idx(i, curr_j, curr_s)]) {
in_team1[i] = false;
} else {
in_team1[i] = true;
curr_j--;
curr_s -= x;
}
}
bool first = true;
for (int i = 0; i < n; i++) {
if (in_team1[i]) {
if (!first) cout << " ";
cout << arr[i];
first = false;
}
}
cout << "\n";
first = true;
for (int i = 0; i < n; i++) {
if (!in_team1[i]) {
if (!first) cout << " ";
cout << arr[i];
first = false;
}
}
cout << "\n";
}