Submission #224420

#TimeUsernameProblemLanguageResultExecution timeMemory
224420BruteforcemanKoala Game (APIO17_koala)C++11
81 / 100
72 ms404 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];
  while(can.size() > 1) {
    int i = W / can.size();
    i = min(10, 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 selfSort(vector <int> &v, function <bool (int, int)> f) {
  if(v.size() == 3) {
    if(f(v[1], v[0])) swap(v[0], v[1]);
    if(f(v[2], v[1])) swap(v[1], v[2]);
    if(f(v[1], v[0])) swap(v[0], v[1]);
    return ;
  }
  if(v.size() <= 1) return ;
  vector <int> l, r;
  int m = v.size() / 2;
  for(int i = 0; i < m; i++) l.emplace_back(v[i]);
  for(int i = m; i < v.size(); i++) r.emplace_back(v[i]);
  v.clear();
  selfSort(l, f);
  selfSort(r, f);
  int i = 0, j = 0;
  while(i < l.size() || j < r.size()) {
    if(i < l.size() && j < r.size()) {
      if(f(l[i], r[j])) v.emplace_back(l[i++]);
      else v.emplace_back(r[j++]);
    } else if (i < l.size()) v.emplace_back(l[i++]);
    else v.emplace_back(r[j++]);
  }
}
void getAll(vector <int> &v, int N, int W) {
  int opt = W / v.size();
//  if(opt > 10) {
//    selfSort(v, [&] (int i, int j) { return cmp(N, W, i, j); });
//    return ;
//  }
  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()) {
    selfSort(v, [&] (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;
  }
} 

Compilation message (stderr)

koala.cpp: In function 'void selfSort(std::vector<int>&, std::function<bool(int, int)>)':
koala.cpp:82:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i = m; i < v.size(); i++) r.emplace_back(v[i]);
                  ~~^~~~~~~~~~
koala.cpp:87:11: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   while(i < l.size() || j < r.size()) {
         ~~^~~~~~~~~~
koala.cpp:87:27: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   while(i < l.size() || j < r.size()) {
                         ~~^~~~~~~~~~
koala.cpp:88:10: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     if(i < l.size() && j < r.size()) {
        ~~^~~~~~~~~~
koala.cpp:88:26: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     if(i < l.size() && j < r.size()) {
                        ~~^~~~~~~~~~
koala.cpp:91:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     } else if (i < l.size()) v.emplace_back(l[i++]);
                ~~^~~~~~~~~~
#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...