Submission #1325374

#TimeUsernameProblemLanguageResultExecution timeMemory
1325374adiyerKoala Game (APIO17_koala)C++20
90 / 100
32 ms456 KiB
#include "koala.h"
#include <bits/stdc++.h>

using namespace std;

int minValue(int n, int w) {
    int b[n], r[n];
    memset(b, 0, sizeof(b));
    b[0] = 1;
    playRound(b, r);
    for(int i = 0; i < n; i++)
        if(r[i] == 0)
            return i;
    memset(b, 0, sizeof(b));
    b[1] = 1;
    playRound(b, r);
    for(int i = 0; i < n; i++)
        if(r[i] == 0)
            return i;
    return 0;
}

int maxValue(int n, int w) {
    int b[n], r[n];
    memset(b, 0, sizeof(b));
    for(int i = 0; i < n; i++) 
        b[i] = 1;
    playRound(b, r);
    memset(b, 0, sizeof(b));
    for(int i = 0; i < n; i++)
        if(r[i] > 1)
            b[i] = 2;
    playRound(b, r);
    memset(b, 0, sizeof(b));
    for(int i = 0; i < n; i++)
        if(r[i] > 1)
            b[i] = 4;
    playRound(b, r);
    memset(b, 0, sizeof(b));
    for(int i = 0; i < n; i++)
        if(r[i] > 1)
            b[i] = 11;
    playRound(b, r);
    for(int i = 0; i < n; i++)
        if(r[i] > 1)
            return i;
    return 0;
}

int greaterValue(int n, int w) {
    int b[n], r[n];
    memset(b, 0, sizeof(b));
    b[0] = b[1] = 5;
    playRound(b, r);
    if(r[0] > 5 && r[1] <= 5) return 0;
    if(r[0] <= 5 && r[1] > 5) return 1;
    if(r[0] <= 5 && r[1] <= 5){
        memset(b, 0, sizeof(b));
        b[0] = b[1] = 3;
        playRound(b, r);
        if(r[0] > 3 && r[1] <= 3) return 0;
        if(r[0] <= 3 && r[1] > 3) return 1;
        memset(b, 0, sizeof(b));
        b[0] = b[1] = 1;
        playRound(b, r);
        if(r[0] > 1 && r[1] <= 1) return 0;
        if(r[0] <= 1 && r[1] > 1) return 1;
    }

    if(r[0] > 5 && r[1] > 5){
        memset(b, 0, sizeof(b));
        b[0] = b[1] = 8;
        playRound(b, r);
        if(r[0] > 8 && r[1] <= 8) return 0;
        if(r[0] <= 8 && r[1] > 8) return 1;
    }
    return 0;
}

void solve(vector < int > pos, int n, int w, int *p, int l = 1, int r = 100){
    if(l == r){
        p[pos[0]] = l;
        return; 
    }
    vector < int > pos1, pos2;
    int B[n], R[n], x = min((int)sqrt(2 * l), w / (r - l + 1));
    for(int i = 0; i < n; i++) B[i] = 0;
    for(int i = 0; i < n; i++) R[i] = 0;
    for(int i : pos) B[i] = x;
    playRound(B, R);
    for(int i : pos){
        if(R[i] > x) pos2.push_back(i);
        else pos1.push_back(i);
    }
    if(pos1.empty() || pos2.empty()) return;
    solve(pos1, n, w, p, l, l + pos1.size() - 1);
    solve(pos2, n, w, p, r - pos2.size() + 1, r);
}

void allValues(int n, int w, int *p) {
    for(int i = 0; i < n; i++) p[i] = 0;
    vector < int > pos;
    for(int i = 0; i < n; i++) pos.push_back(i);
    solve(pos, n, w, p);
}
#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...