제출 #368098

#제출 시각아이디문제언어결과실행 시간메모리
368098KoDScales (IOI15_scales)C++17
71.73 / 100
1 ms396 KiB
#include "scales.h"
#include <bits/stdc++.h>

void init(int) { }

std::tuple<int, int, int> get_min(int a, int b, int c) {
    const auto t = getLightest(a, b, c);
    if (t == b) std::swap(a, b);
    if (t == c) std::swap(a, c);
    return std::make_tuple(a, b, c);
}

std::array<int, 4> sort4(std::array<int, 4> arr) {
    auto [a, b, c] = get_min(arr[0], arr[1], arr[2]);
    const auto d = arr[3];
    // a < b, a < c
    const auto h = getHeaviest(b, c, d);
    if (h == c) {
        std::swap(b, c);
    }
    if (h == b) {
        // a < c < b, d < b
        const auto m = getMedian(a, c, d);
        if (m == a) {
            return { d, a, c, b };
        }
        else if (m == c) {
            return { a, c, d, b };
        }
        else {
            return { a, d, c, b };
        }
    }
    else {
        // a < c < d, a < b < d
        if (getLightest(b, c, d) == b) {
            return { a, b, c, d };
        }
        else {
            return { a, c, b, d };
        }
    }
}

void orderCoins() {
    auto [a, b, c] = get_min(1, 2, 3);
    auto [d, e, f] = get_min(4, 5, 6);
    const auto arr = sort4(std::array<int, 4>{ b, c, e, f });
    // currently 5 queries
    if (arr[0] > 3) {
        std::swap(a, d);
    }
    std::array<int, 6> ret;
    if ((arr[1] > 3) == (d > 3)) {
        const auto m = getMedian(a, d, arr[0]);
        if (m == a) {
            ret = { d, a, arr[0], arr[1], arr[2], arr[3] };
        }
        else if (m == d) {
            ret = { a, d, arr[0], arr[1], arr[2], arr[3] };
        }
        else {
            ret = { a, arr[0], d, arr[1], arr[2], arr[3] };
        }
    }
    else {
        const auto m = getMedian(a, d, arr[0]);
        if (m == a) {
            ret = { d, a, arr[0], arr[1], arr[2], arr[3] };
        }
        else if (m == d) {
            ret = { a, d, arr[0], arr[1], arr[2], arr[3] };
        }
        else {
            if (getLightest(d, arr[1], arr[2]) == d) {
                ret = { a, arr[0], d, arr[1], arr[2], arr[3] };
            }
            else {
                ret = { a, arr[0], arr[1], d, arr[2], arr[3] };
            }
        }
    }
    int tmp[6] = {};
    for (int i = 0; i < 6; ++i) {
        tmp[i] = ret[i];
    }
    answer(tmp);
}
#Verdict Execution timeMemoryGrader output
Fetching results...