Submission #953176

#TimeUsernameProblemLanguageResultExecution timeMemory
953176ItamarKoala Game (APIO17_koala)C++14
69 / 100
38 ms600 KiB
#include "koala.h"
using namespace std;
#include <bitset>
#include <vector>

bitset<100> buy(int* a, int* b) {
    playRound(a, b);
    bitset<100> ans;
    for (int i = 0; i < 100; i++)if (b[i] > a[i])ans[i] = 1;
    return ans;
}

int maxValue(int N, int W) {
    bitset<100> can; for (int i = 0; i < N; i++)can[i] = 1;

    while (can.count() > 1) {
        int a[100], b[100];
        for (int i = 0; i < 100; i++)if (can[i])a[i] = 100 / can.count(); else a[i] = 0;

        can = can & buy(a, b);
    }
    for (int i = 0; i < N; i++)if (can[i])return i;
}

int mmaxValue(int N, int W, bitset<100> op) {
    bitset<100> can = op;

    while (can.count() > 1) {
        int a[100], b[100];
        int l = 0, r = 2 * (op.count() / can.count());
        while (l < r) {
            int mid = (l + r) / 2;
            for (int i = 0; i < 100; i++)if (can[i])a[i] = mid; else a[i] = 0;
            bitset<100> c = can & buy(a, b);
            if (c == can) {
                l = mid + 1;
            }
            else if (c.count() == 0) {
                r = mid - 1;
            }
            else {
                can = c;
                break;
            }
        }
    }
    for (int i = 0; i < N; i++)if (can[i])return i;
}




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

int greaterValue(int N, int W) {
    int l = 1, r = 16;
    while (true) {
        int mid = (l + r) / 2;
        int a[100], b[100];
        for (int i = 2; i < N; i++) {
            a[i] = 0;
        }
        a[1] = mid, a[0] = mid;
        bitset<100> op = buy(a, b);
        if (op[1] != op[0]) {
            if (op[1])return 1;
            return 0;
        }
        if (op[0]) {
            l = mid + 1;
        }
        else {
            r = mid - 1;
        }
    }
    return 0;
}
void allValues(int N, int W, int* P) {
    if (W == 2 * N) {
        // TODO: Implement Subtask 4 solution here.
        // You may leave this block unmodified if you are not attempting this
        // subtask.
    }
    else {
        bitset<100> op; for (int i = 0; i < N; i++)op[i] = 1;
        for (int i = N; i > 0; i--) {
            int in = mmaxValue(N, W, op);
            P[in] = i;
            op[in] = 0;
        }
    }
}

Compilation message (stderr)

koala.cpp: In function 'int maxValue(int, int)':
koala.cpp:23:1: warning: control reaches end of non-void function [-Wreturn-type]
   23 | }
      | ^
koala.cpp: In function 'int mmaxValue(int, int, std::bitset<100>)':
koala.cpp:48:1: warning: control reaches end of non-void function [-Wreturn-type]
   48 | }
      | ^
#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...