Submission #719554

#TimeUsernameProblemLanguageResultExecution timeMemory
719554veehzPrisoner Challenge (IOI22_prison)C++17
80 / 100
14 ms1020 KiB
#include "prison.h"

#include <bits/stdc++.h>
using namespace std;

int get_num(int digit, int pos) {
  if (pos < 7)
    return 3 * pos + digit + 1;
  else
    return get_num(2, 6) + 1;
}

string base3(int n) {
  string s;
  while (n) {
    s += (n % 3) + '0';
    n /= 3;
  }
  while (s.size() < 8) s += '0';
  reverse(s.begin(), s.end());
  return s;
}

int whichBag(int pos, int ifA, int ifB) {
  if (pos % 2) return ifA;
  return ifB;
}

vector<vector<int>> devise_strategy(int n) {
  vector<vector<int>> strategy(23, vector<int>(n + 1));
  for (int pos = 0; pos < 8; pos++) {
    for (int digit = 0; digit < 3; digit++) {
      int num = get_num(digit, pos);
      if (num >= 0) strategy[num][0] = whichBag(pos, 0, 1);
    }
  }

  for (int i = 1; i <= n; i++) {
    string cur = base3(i);
    strategy[0][i] = get_num(cur[0] - '0', 0);
    for (int pos = 0; pos < 8; pos++) {
      int thisDigit = cur[pos] - '0';
      for (int digit = 0; digit < 3; digit++) {
        int num = get_num(digit, pos);
        if (num >= 0) {
          if (thisDigit > digit)
            strategy[num][i] = whichBag(pos, -2,-1);
          else if (thisDigit < digit)
            strategy[num][i] = whichBag(pos, -1, -2);
          else if (thisDigit == digit && pos != 7) {
            strategy[num][i] = get_num(cur[pos + 1] - '0', pos + 1);
            if (pos == 6) {
              if(cur[pos + 1] - '0' == 0){ strategy[num][i] = -2; continue; }
              else if(cur[pos + 1] - '0' == 2) { strategy[num][i] = -1; continue; }
            }
          }
        }
      }
    }
  }

  // for(auto& v : strategy){
  //   for(auto& x : v) cout << x << " ";
  //   cout << endl;
  // }


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