Submission #1230311

#TimeUsernameProblemLanguageResultExecution timeMemory
1230311inesfiPrisoner Challenge (IOI22_prison)C++20
80 / 100
9 ms1604 KiB
#include "prison.h"
#include<bits/stdc++.h>
using namespace std;

#define ll long long

struct pos {
    int logec,etat;

    void afficher(){
        cout<<"log "<<logec<<" etat "<<etat<<endl;
    }
};

const int LOGMAXI=8;
vector<vector<int>> strategie;
vector<int> binaire;
int nbpos;

pos nb_vers_pos(int n){
    if (n==nbpos){
        return {n/3,1};
    }
    n--;
    return {n/3,n%3};
}

int pos_vers_nb(pos n){
    return n.etat+n.logec*3+1;
}

void decomp(int n){
    binaire.clear();
    for (int i=0;i<LOGMAXI;i++) {
        binaire.push_back(n%3);
        n/=3;
    }
    reverse(binaire.begin(),binaire.end());
}

vector<vector<int>> devise_strategy(int N) {
    nbpos=22;
    strategie.clear();
    for (int i=0;i<=nbpos;i++){
        vector<int> ajout={};
        pos act=nb_vers_pos(i);
        if (i==0){
            ajout.push_back(0);
        }
        else {
            ajout.push_back((act.logec+1)%2);
        }
        for (int j=1;j<=N;j++){
            decomp(j);
            if (i==0){
                ajout.push_back(pos_vers_nb({0,binaire[0]}));
            }
            else if (act.etat==binaire[act.logec]){
                if (act.logec==LOGMAXI-2){
                    if (binaire[act.logec+1]==0){
                        ajout.push_back(-2);
                    }
                    else if (binaire[act.logec+1]==2){
                        ajout.push_back(-1);
                    }
                    else {
                        ajout.push_back(nbpos);
                    }
                }
                else if (act.logec==LOGMAXI-1){
                    ajout.push_back(0);
                }
                else {
                    //cout<<pos_vers_nb({act.logec+1,binaire[act.logec+1]})<<endl;
                    ajout.push_back(pos_vers_nb({act.logec+1,binaire[act.logec+1]}));
                }
            }
            else {
                if (act.etat<binaire[act.logec]){
                    if (act.logec%2==0){
                        ajout.push_back(-1);
                    }
                    else {
                        ajout.push_back(-2);
                    }
                }
                else {
                    if (act.logec%2==0){
                        ajout.push_back(-2);
                    }
                    else {
                        ajout.push_back(-1);
                    }
                }
            }
        }
        strategie.push_back(ajout);
    }
    /*for (int i=0;i<=nbpos;i++){
        for (int j=0;j<=N;j++){
            cout<<strategie[i][j]<<" ";
        }
        cout<<endl;
    }*/
    //nb_vers_pos(21).afficher();
    return strategie;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...