제출 #224409

#제출 시각아이디문제언어결과실행 시간메모리
224409BruteforcemanKoala Game (APIO17_koala)C++11
78 / 100
72 ms512 KiB
#include <bits/stdc++.h>
#include "koala.h"
using namespace std;

int minValue(int N, int W) {
    // TODO: Implement Subtask 1 solution here.
    // You may leave this function unmodified if you are not attempting this
    // subtask.
    int A[N], B[N];
    for(int i = 0; i < N; i++) {
      if(i)  A[i] = 0;
      else A[i] = 1;
    }
    playRound(A, B);
    for(int i = 0; i < N; i++) {
      if(A[i] >= B[i]) return i;
    }
    return 0;
}

int maxValue(int N, int W) {
    // TODO: Implement Subtask 2 solution here.
    // You may leave this function unmodified if you are not attempting this
    // subtask.
  vector <int> can;
  for(int i = 0; i < N; i++) can.emplace_back(i);
  int A[N], B[N];
  for(int i = 1; i <= 13; i++) {
    memset(A, 0, sizeof A);
    for(int j : can) {
      A[j] = i;
    }
    playRound(A, B);
    vector <int> aux;
    for(int j : can) {
      if(A[j] < B[j]) aux.emplace_back(j);
    }
    swap(can, aux);
    if(can.size() == 1) return can[0];
  }
  return 0;
}

int cmp(int sz, int coin,  int N, int W) {
    // TODO: Implement Subtask 3 solution here.
    // You may leave this function unmodified if you are not attempting this
    // subtask.
  if(N == W) return 0;
  int l = 1, r = min(13, coin / 2);
  int A[sz],  B[sz];
  while(l <= r) {
    int m = (l + r) >> 1;
    memset(A, 0, sizeof A);
    A[N] = A[W] = m;
    playRound(A, B);
    if(A[N] < B[N] && A[W] < B[W]) {
      l = m + 1;
    } else if (A[N] >= B[N] && A[W] >= B[W]) {
      r = m - 1;
    } else {
      return B[N] < B[W];
    }
  }
  return 0;
}
int greaterValue(int N, int W) {
  return cmp(N, W, 0, 1);
}
void getAll(vector <int> &v, int N, int W) {
  int opt = W / v.size();
  int A[N], B[N];
  memset(A, 0, sizeof A);
  for(int i : v) {
    A[i] = opt;
  }
  playRound(A, B);
  vector <int> left, right;
  for(int i : v) {
    if(A[i] < B[i]) right.emplace_back(i);
    else left.emplace_back(i);
  }
  if(left.empty() || right.empty()) {
    sort(v.begin(), v.end(),  [&] (int i, int j) { return cmp(N, W, i, j);  });
  } else {
    getAll(left, N, W);
    getAll(right, N, W);
    v = left;
    for(int i : right) v.emplace_back(i);
  }
}
void allValues(int N, int W, int *P) {
  vector <int> v (N);
  for(int i = 0; i < N; i++) {
    v[i] = i;
  }
  getAll(v, N, W);
  for(int i = 0; i < N; i++) {
    P[v[i]] = i + 1;
  }
} 
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...