Submission

Status:

PPPP-PP---

Subtask/Task Score:

60/100

Score: 60

User: NJTYTYTY

Problemset: ประลอง

Language: cpp

Time: 0.005 second

Submitted On: 2026-08-11 19:49:22

#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n;
    cin >> n;

    vector<int> a(n);
    int total = 0;

    for (int &x : a) {
        cin >> x;
        total += x;
    }

    // จำนวนสมาชิกที่ฝ่าย 1 ต้องมี
    int k = n / 2;

    /*
        dp[cnt] = map จาก sum -> mask
        mask ใช้เก็บว่ามี index ไหนถูกเลือกเข้าฝ่าย 1
    */
    vector<unordered_map<int, unsigned long long>> dp(k + 1);

    dp[0][0] = 0;

    for (int i = 0; i < n; i++) {

        // เดินย้อนจาก k ลงมา เพื่อไม่ให้ใช้สมาชิกตัวเดิมซ้ำ
        for (int cnt = min(k, i + 1); cnt >= 1; cnt--) {

            for (auto [sum, mask] : dp[cnt - 1]) {

                int newSum = sum + a[i];
                unsigned long long newMask =
                    mask | (1ULL << i);

                // เก็บ state นี้ถ้ายังไม่มี
                if (!dp[cnt].count(newSum)) {
                    dp[cnt][newSum] = newMask;
                }
            }
        }
    }

    // หาผลรวมของฝ่าย 1 ที่ทำให้ต่างจากฝ่าย 2 น้อยที่สุด
    int bestSum = 0;
    long long bestDiff = LLONG_MAX;
    unsigned long long bestMask = 0;

    for (auto [sum, mask] : dp[k]) {

        long long diff =
            llabs((long long)sum - (total - sum));

        if (diff < bestDiff) {
            bestDiff = diff;
            bestSum = sum;
            bestMask = mask;
        }
    }

    // แสดงฝ่าย 1
    bool first = true;

    for (int i = 0; i < n; i++) {
        if (bestMask & (1ULL << i)) {
            if (!first) cout << ' ';
            cout << a[i];
            first = false;
        }
    }

    cout << '\n';

    // แสดงฝ่าย 2
    first = true;

    for (int i = 0; i < n; i++) {
        if (!(bestMask & (1ULL << i))) {
            if (!first) cout << ' ';
            cout << a[i];
            first = false;
        }
    }

    cout << '\n';

    return 0;
}