제출 #1344037

#제출 시각아이디문제언어결과실행 시간메모리
1344037avighnaAncient Machine (JOI21_ancient_machine)C++20
5 / 100
36 ms1948 KiB
#include "Anna.h"
#include <vector>

void Anna(int N, std::vector<char> S) {
  for (int i = 0; i < N; ++i) {
    int x = S[i] - 'X';
    for (int bt = 1; bt >= 0; --bt) {
      Send(!!(x & 1 << bt));
    }
  }
}
#include "Bruno.h"
#include <vector>

using namespace std;

void Bruno(int N, int L, std::vector<int> A) {
  vector<char> a(N);
  for (int i = 0; i < N; ++i) {
    a[i] = (A[2 * i] << 1) + A[2 * i + 1] + 'X';
  }

  vector<int> dp(1 << N);
  for (int mask = 1; mask < 1 << N; ++mask) {
    for (int i = 0; i < N; ++i) {
      if (!(mask & 1 << i)) {
        continue;
      }
      dp[mask] = max(dp[mask], dp[mask ^ (1 << i)]);
      if (a[i] != 'Y') {
        continue;
      }
      int lef = -1, rig = -1;
      for (int j = 0; j < i; ++j) {
        if (mask & 1 << j) {
          lef = j;
        }
      }
      for (int j = N - 1; j > i; --j) {
        if (mask & 1 << j) {
          rig = j;
        }
      }
      if (lef != -1 && rig != -1 && a[lef] == 'X' && a[rig] == 'Z') {
        dp[mask] = max(dp[mask], dp[mask ^ (1 << i)] + 1);
      }
    }
  }

  int mask = (1 << N) - 1;
  while (mask) {
    for (int i = 0; i < N; ++i) {
      if (!(mask & 1 << i)) {
        continue;
      }
      if (dp[mask] == dp[mask ^ (1 << i)]) {
        Remove(i);
        mask ^= 1 << i;
        break;
      }
      if (a[i] != 'Y') {
        continue;
      }
      int lef = -1, rig = -1;
      for (int j = 0; j < i; ++j) {
        if (mask & 1 << j) {
          lef = j;
        }
      }
      for (int j = N - 1; j > i; --j) {
        if (mask & 1 << j) {
          rig = j;
        }
      }
      if (lef != -1 && rig != -1 && a[lef] == 'X' && a[rig] == 'Z' && dp[mask] == dp[mask ^ (1 << i)] + 1) {
        Remove(i);
        mask ^= 1 << i;
        break;
      }
    }
  }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...