Submission #557633

# Submission time Handle Problem Language Result Execution time Memory
557633 2022-05-05T16:34:34 Z nutella Koala Game (APIO17_koala) C++17
37 / 100
89 ms 448 KB
#include "koala.h"

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int maxN = 100;
int B[maxN], R[maxN];

void cl() {
    memset(B, 0, sizeof(B));
    memset(R, 0, sizeof(R));
}

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.
    cl();
    B[0] = 1;
    playRound(B, R);
    if (R[0]) {
        return int(min_element(R, R + N) - R);
    } else {
        return 0;
    }
}

int maxValue(int N, int W) {
    // return i such as P[i] = n
    vector<int> left(N);
    iota(begin(left), end(left), 0);
    while (size(left) > 1) {
        int x = W / (int) size(left);
        cl();
        for (int i: left)
            B[i] = x;
        playRound(B, R);
        vector<int> tmp;
        for (int i: left)
            if (B[i] < R[i])
                tmp.push_back(i);
        swap(tmp, left);
    }
    assert(size(left) == 1);
    return left[0];
}

int greaterValue(int N, int W) {
    // compare P[0] and P[1]
    int l = 0, r = W / 8;
    while (l + 1 < r) {
        int m = (l + r) >> 1;
        cl();
        B[0] = B[1] = m;
        playRound(B, R);
        bool took1 = R[0] > B[0];
        bool took2 = R[1] > B[1];
        if (took1 && took2) l = m;
        else if (!took1 && !took2) r = m;
        else if (took1) return 0;
        else return 1;
    }
    return 0;
}

void allValues(int N, int W, int *P) {
    if (W == N) {
        vector<bool> used(N);
        for (int v = N; v > 0; --v) {
            W = v;
            vector<int> left;
            for (int i = 0; i < N; ++i) {
                if (!used[i])
                    left.push_back(i);
            }
            while (size(left) > 1) {
                int x = W / (int) size(left);
                int l = 0, r = x + 1;
                bool ok = false;
                while (l + 1 < r) {
                    int mid = (l + r) >> 1;
                    cl();
                    for (int i: left)
                        B[i] = mid;
                    playRound(B, R);
                    vector<int> tmp;
                    for (int i: left)
                        if (B[i] < R[i])
                            tmp.push_back(i);
                    if (!tmp.empty()) {
                        left = tmp;
                        ok = true;
                        break;
                    }
                    else r = mid;
                }
                assert(ok);
            }
            if (size(left) != 1) {
                cout << v << endl;
            }
            assert(size(left) == 1);
            P[left[0]] = v;
            used[left[0]] = true;
        }
    } else {

    }
}
# Verdict Execution time Memory Grader output
1 Correct 4 ms 208 KB Output is correct
2 Correct 4 ms 208 KB Output is correct
3 Correct 4 ms 208 KB Output is correct
4 Correct 4 ms 208 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 11 ms 316 KB Output is correct
2 Correct 13 ms 316 KB Output is correct
3 Correct 12 ms 324 KB Output is correct
4 Correct 12 ms 324 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 46 ms 316 KB Output is correct
2 Correct 63 ms 448 KB Output is correct
3 Correct 44 ms 336 KB Output is correct
4 Correct 44 ms 328 KB Output is correct
5 Correct 46 ms 344 KB Output is correct
6 Correct 44 ms 336 KB Output is correct
7 Correct 43 ms 328 KB Output is correct
8 Correct 43 ms 332 KB Output is correct
9 Correct 43 ms 332 KB Output is correct
10 Correct 44 ms 336 KB Output is correct
# Verdict Execution time Memory Grader output
1 Incorrect 0 ms 208 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 89 ms 292 KB Output isn't correct
2 Halted 0 ms 0 KB -