Submission #1366001

#TimeUsernameProblemLanguageResultExecution timeMemory
1366001NxmkxingCombo (IOI18_combo)C++20
5 / 100
0 ms412 KiB
#include "combo.h"
#include <bits/stdc++.h>
using namespace std;

int n;
string guess;

char decode(int x) {
  if (x == 0) return 'A';
  else if (x == 1) return 'B';
  else if (x == 2) return 'X';
  else if (x == 3) return 'Y';
  return '\n';
}

int findNext(string guess) {
  int sz = guess.size();
  int l = 0, r = 3;
  while (l < r) {
    int mid = (l + r) / 2;
    string combo;
    for (int i = 0; i <= mid; i++) {
      combo = combo + guess;
      combo.push_back(decode(i));
    }
    if (press(combo) >= sz + 1) {
      r = mid;
    }
    else {
      l = mid + 1;
    }
  }
  return l;
}

std::string guess_sequence(int N) {
  n = N;
  guess.clear();
  int start = findNext(guess);
  guess.push_back(decode(start));
  string left;
  for (int i = 0; i < 4; i++) {
    if (i != start) left.push_back(decode(i));
  }
  while (guess.size() < n - 1) {
    string combo;

    combo = combo + guess;
    combo.push_back(left[0]);
    combo.push_back(left[0]);

    combo = combo + guess;
    combo.push_back(left[0]);
    combo.push_back(left[1]);

    combo = combo + guess;
    combo.push_back(left[0]);
    combo.push_back(left[2]);

    combo = combo + guess;
    combo.push_back(left[1]);

    int sz = guess.size();
    int total = press(combo);
    
    if (total == sz) {
      guess.push_back(left[2]);
    }
    else if (total == sz + 1) {
      guess.push_back(left[1]);
    }
    else if (total == sz + 2) {
      guess.push_back(left[0]);
    }
  }
  int last = findNext(guess);
  guess.push_back(decode(last));
  return guess;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...