Submission #1153736

#TimeUsernameProblemLanguageResultExecution timeMemory
1153736wiiScales (IOI15_scales)C++20
45.45 / 100
0 ms328 KiB
#include "scales.h"
#include <bits/stdc++.h>
using namespace std;

int seed = chrono::high_resolution_clock::now().time_since_epoch().count();
//int seed = 5;
mt19937 rng(seed);

int ans[6];
void sh(int id) {
    for (int i = 5; i > id; --i)
        ans[i] = ans[i - 1];
}

void init(int T) {

}

void orderCoins() {
    for (int i = 0; i < 6; ++i)
        ans[i] = i + 1;
    shuffle(ans, ans + 6, rng);

//    for (int i = 0; i < 6; ++i)
//        cout << ans[i] << " \n"[i + 1 == 6];

    int heavy = getHeaviest(ans[0], ans[1], ans[2]);
    heavy = getHeaviest(ans[3], ans[4], heavy);

    for (int i = 0; i < 5; ++i) if (ans[i] == heavy)
        swap(ans[i], ans[4]);

//    for (int i = 0; i < 6; ++i)
//        cout << ans[i] << " \n"[i + 1 == 6];

    // sort
    if (1) {
        if (getLightest(ans[0], ans[1], heavy) == ans[1])
            swap(ans[0], ans[1]);

        if (getLightest(ans[2], ans[3], heavy) == ans[3])
            swap(ans[2], ans[3]);

        int f = getMedian(ans[0], ans[1], ans[2]);

        vector<int> order;
        if (f == ans[0]) {
            // ans[2] ans[0] ans[1]
            order.push_back(ans[2]);

            int k = getMedian(ans[0], ans[1], ans[3]);
            if (k == ans[0]) {
                // ans[3] ans[0] ans[1]
                order.push_back(ans[3]);
                order.push_back(ans[0]);
                order.push_back(ans[1]);
            }

            if (k == ans[1]) {
                // ans[0] ans[1] ans[3]
                order.push_back(ans[0]);
                order.push_back(ans[1]);
                order.push_back(ans[3]);
            }

            if (k == ans[3]) {
                // ans[0] ans[3] ans[1]
                order.push_back(ans[0]);
                order.push_back(ans[3]);
                order.push_back(ans[1]);
            }
        }

        if (f == ans[1]) {
            // ans[0] ans[1] ans[2]
            order.push_back(ans[0]);
            order.push_back(ans[1]);
            order.push_back(ans[2]);
            order.push_back(ans[3]);
        }

        if (f == ans[2]) {
            // ans[0] ans[2] ans[1]

            order.push_back(ans[0]);
            order.push_back(ans[2]);

            if (getLightest(ans[1], ans[3], heavy) == ans[1]) {
                order.push_back(ans[1]);
                order.push_back(ans[3]);
            } else {
                order.push_back(ans[3]);
                order.push_back(ans[1]);
            }
        }

        for (int i = 0; i < order.size(); ++i)
            ans[i] = order[i];
    }

//    for (int i = 0; i < 6; ++i)
//        cout << ans[i] << " \n"[i + 1 == 6];

//    cout << heavy << endl;

    int last = ans[5];
    if (getLightest(ans[0], ans[1], last) == last) {
        sh(0); ans[0] = last; answer(ans); return;
    }

    for (int i = 0; i < 3; i += 2) {
        int k = getMedian(ans[i + 1], ans[i + 2], last);

        if (k == ans[i + 1]) {
            sh(i + 1); ans[i + 1] = last; break;
        }

        if (k == last) {
            sh(i + 2); ans[i + 2] = last; break;
        }
    }

    answer(ans);
}
#Verdict Execution timeMemoryGrader output
Fetching results...