제출 #769845

#제출 시각아이디문제언어결과실행 시간메모리
769845adrilen죄수들의 도전 (IOI22_prison)C++17
80 / 100
17 ms1020 KiB
#include "prison.h"
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using arr = array<int, 2>;
using arrr = array<int, 3>;

// Bruker tretalls systemet

std::vector<std::vector<int>> devise_strategy(int n) {
    int x = 22, s = x + 1;
    vector<vector<int>> output(s, vector<int>(n + 1));

    // Open bag A
    output[0][0] = 0;

    for (int j = 1; j <= n; j++)
    {
        output[0][j] = 6 * 3 + 2 + (j / (int)pow(3, 7));
        // cout << output[0][j] << "\n";
    }

    
    for (int y = 0; y < 7; y++ )
    {
        for (int i = 2 + y * 3; i <= 4 + y * 3; i++)
        {
            output[i][0] = ((y + 1) & 1); 

            for (int j = 1; j <= n; j++)
            {
                if (y * 3 + 2 + ((j % (int)pow(3, y + 2)) / (int)pow(3, y + 1)) == i)
                {
                    if (y != 0)
                    {
                        output[i][j] = (y - 1) * 3 + 2 + ((j % (int)pow(3, y + 1)) / (int)pow(3, y));
                    } else {
                        if ((y - 1) * 3 + 2 + ((j % (int)pow(3, y + 1)) / (int)pow(3, y)) == -1) output[i][j] = - 1 - output[i][0];
                        else if ((y - 1) * 3 + 2 + ((j % (int)pow(3, y + 1)) / (int)pow(3, y)) == 1) output[i][j] = - 1 - (1 ^ output[i][0]);
                        else output[i][j] = 1;
                    }
                } else if (i > y * 3 + 2 + ((j % (int)pow(3, y + 2)) / (int)pow(3, y + 1)))
                {
                    output[i][j] = -1 - output[i][0];
                } else {
                    output[i][j] = -1 - (1 ^ output[i][0]);
                }
            }
        }
    }

    // Handle state 1
    output[1][0] = 0;

    for (int i = 1; i <= n; i++)
    {   
        if (i % 3 == 0) output[1][i] = -1;
        else if (i % 3 == 2) output[1][i] = -2;
        else output[1][i] = 0; 
    }

    // State 1 and state 3 leads only to victory or loss
    // Can therefore be spared

    // for (int i = 1; i <= 3; i++)
    // {
    //     output[i][0] = 1;

    //     for (int j = 1; j <= n; j++)
    //     {
    //         if (j % 3 > i % 3)
    //         {
    //             output[i][j] = -2;
    //         } else if (j % 3 < i % 3)
    //         {
    //             output[i][j] = -1;
    //         } else {
    //             output[i][j] = 0;
    //         }
    //     }
    // }




    return output;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...