제출 #424145

#제출 시각아이디문제언어결과실행 시간메모리
424145InternetPerson10저울 (IOI15_scales)C++17
72.92 / 100
57 ms324 KiB
#include "scales.h"
#include <bits/stdc++.h>

using namespace std;

void init(int T) {
    /* ... */
}

bool good[720];
int l[20][3], h[20][3], m[20][3], g[60][3];
vector<int> v = {1, 2, 3, 4, 5, 6}, v2 = {1, 2, 3, 4, 5, 6};

void answer(int W[]);

int lightest(int a, int b, int c) {
    int x = v[a], y = v[b], z = v[c];
    int ans = min(x, min(y, z));
    if(ans == x) return a;
    if(ans == y) return b;
    if(ans == z) return c;
    return 69;
}

int heaviest(int a, int b, int c) {
    int x = v[a], y = v[b], z = v[c];
    int ans = max(x, max(y, z));
    if(ans == x) return a;
    if(ans == y) return b;
    if(ans == z) return c;
    return 69;
}

int mediaest(int a, int b, int c) {
    int x = v[a], y = v[b], z = v[c];
    int ans = x + y + z - min(x, min(y, z)) - max(x, max(y, z));
    if(ans == x) return a;
    if(ans == y) return b;
    if(ans == z) return c;
    return 69;
}

int getnext(int a, int b, int c, int d) {
    int x = v[a], y = v[b], z = v[c], w = v[d];
    if(w > x && w > y && w > z) return lightest(a, b, c);
    if(w < x && w < y && w < z) return lightest(a, b, c);
    if(w > v[mediaest(a, b, c)]) return heaviest(a, b, c);
    return mediaest(a, b, c);
}

void orderCoins() {
    for(int i = 0; i < 720; i++) good[i] = true;
    for(int z = 0; z < 7; z++) {
        int ggg = -1;
        for(int y = 0; y < 3; y++) {
            for(int k = 0; k < 20; k++) l[k][y] = h[k][y] = m[k][y] = g[k][y] = 0;
            for(int k = 20; k < 60; k++) g[k][y] = 0;
        }
        do {
            ggg++;
            if(!good[ggg]) continue;
            // cout << ggg << ' ';
            int y = 0;
            for(int i = 0; i < 4; i++) {
                for(int j = i+1; j < 5; j++) {
                    for(int k = j+1; k < 6; k++) {
                        int ll = lightest(i, j, k);
                        if(ll == i) l[y][0]++;
                        if(ll == j) l[y][1]++;
                        if(ll == k) l[y][2]++;
                        int hh = heaviest(i, j, k);
                        if(hh == i) h[y][0]++;
                        if(hh == j) h[y][1]++;
                        if(hh == k) h[y][2]++;
                        int mm = mediaest(i, j, k);
                        if(mm == i) m[y][0]++;
                        if(mm == j) m[y][1]++;
                        if(mm == k) m[y][2]++;
                        int x = 0;
                        for(int w = 0; w < 6; w++) {
                            if(w == i || w == j || w == k) continue;
                            int gg = getnext(i, j, k, w);
                            if(gg == i) g[3*y+x][0]++;
                            if(gg == j) g[3*y+x][1]++;
                            if(gg == k) g[3*y+x][2]++;
                            x++;
                        }
                        y++;
                    }
                }
            }
        } while(next_permutation(v.begin(), v.end()));
        // cout << '\n';
        int best = 999, thebest = -1;
        for(int i = 0; i < 20; i++) {
            int ll = max(l[i][0], max(l[i][1], l[i][2]));
            if(ll <= best) {
                best = ll;
                thebest = i;
            }
        }
        for(int i = 0; i < 20; i++) {
            int hh = max(h[i][0], max(h[i][1], h[i][2]));
            if(hh <= best) {
                best = hh;
                thebest = 20+i;
            }
        }
        for(int i = 0; i < 20; i++) {
            int mm = max(m[i][0], max(m[i][1], m[i][2]));
            if(mm <= best) {
                best = mm;
                thebest = 40+i;
            }
        }
        for(int i = 0; i < 60; i++) {
            int gg = max(g[i][0], max(g[i][1], g[i][2]));
            if(gg <= best) {
                best = gg;
                thebest = 60 + i;
            }
        }
        // cout << best << ' ' << thebest << '\n';
        if(thebest < 20) {
            ggg = 0;
            for(int i = 0; i < 4; i++) {
                for(int j = i+1; j < 5; j++) {
                    for(int k = j+1; k < 6; k++) {
                        if(ggg == thebest) {
                            v.swap(v2);
                            int ax = getLightest(i+1, j+1, k+1) - 1, gg = -1;
                            // cout << "Ax " << ax << '\n';
                            do {
                                gg++;
                                if(!good[gg]) continue;
                                if(lightest(i, j, k) == ax) good[gg] = true;
                                else {
                                    // cout << "Yeeting " << gg << ": " << v[i] << ' ' << v[j] << ' ' << v[k] << '\n';
                                    good[gg] = false;
                                }
                            } while(next_permutation(v.begin(), v.end()));
                            v.swap(v2);
                        }
                        ggg++;
                        // cout << "Gee " << ggg << '\n';
                    }
                }
            }
        }
        else if(thebest < 40) {
            thebest -= 20;
            ggg = 0;
            for(int i = 0; i < 4; i++) {
                for(int j = i+1; j < 5; j++) {
                    for(int k = j+1; k < 6; k++) {
                        if(ggg == thebest) {
                            v.swap(v2);
                            int ax = getHeaviest(i+1, j+1, k+1) - 1, gg = -1;
                            do {
                                gg++;
                                if(!good[gg]) continue;
                                if(heaviest(i, j, k) == ax) good[gg] = true;
                                else good[gg] = false;
                            } while(next_permutation(v.begin(), v.end()));
                            v.swap(v2);
                        }
                        ggg++;
                    }
                }
            }
        }
        else if(thebest < 60) {
            thebest -= 40;
            ggg = 0;
            for(int i = 0; i < 4; i++) {
                for(int j = i+1; j < 5; j++) {
                    for(int k = j+1; k < 6; k++) {
                        if(ggg == thebest) {
                            v.swap(v2);
                            int ax = getMedian(i+1, j+1, k+1) - 1, gg = -1;
                            do {
                                gg++;
                                if(!good[gg]) continue;
                                if(mediaest(i, j, k) == ax) good[gg] = true;
                                else good[gg] = false;
                            } while(next_permutation(v.begin(), v.end()));
                            v.swap(v2);
                        }
                        ggg++;
                    }
                }
            }
        }
        else {
            thebest -= 60;
            ggg = 0;
            for(int i = 0; i < 4; i++) {
                for(int j = i+1; j < 5; j++) {
                    for(int k = j+1; k < 6; k++) {
                        for(int w = 0; w < 6; w++) {
                            if(w == i || w == j || w == k) continue;
                            if(ggg == thebest) {
                                v.swap(v2);
                                int ax = getNextLightest(i+1, j+1, k+1, w+1) - 1, gg = -1;
                                do {
                                    gg++;
                                    if(!good[gg]) continue;
                                    if(getnext(i, j, k, w) == ax) good[gg] = true;
                                    else good[gg] = false;
                                } while(next_permutation(v.begin(), v.end()));
                                v.swap(v2);
                            }
                            ggg++;
                        }
                    }
                }
            }
        }
        int goods = 0;
        for(int i = 0; i < 720; i++) {
            if(good[i]) goods++;
        }
        if(goods == 1) break;
    }
    int W[] = {1, 2, 3, 4, 5, 6};
    int ggg = 0;
    do {
        if(good[ggg]) {
            for(int i = 0; i < 6; i++) W[v[i]-1] = i+1;
        }
        ggg++;
    } while(next_permutation(v.begin(), v.end()));
    answer(W);
}

컴파일 시 표준 에러 (stderr) 메시지

scales.cpp: In function 'void init(int)':
scales.cpp:6:15: warning: unused parameter 'T' [-Wunused-parameter]
    6 | void init(int T) {
      |           ~~~~^
#Verdict Execution timeMemoryGrader output
Fetching results...