Submission #919209

# Submission time Handle Problem Language Result Execution time Memory
919209 2024-01-31T13:01:05 Z boris_mihov Koala Game (APIO17_koala) C++17
33 / 100
52 ms 596 KB
#include "koala.h"
#include <algorithm>
#include <iostream>
#include <numeric>
#include <cassert>
#include <vector>

typedef long long llong;
const int MAXN = 128;
const int INF =  1e9;

int n, w;
int __b[MAXN];
int __r[MAXN];
std::vector <int> play(const std::vector <int> &b)
{
    assert(b.size() == n);
    for (int i = 0 ; i < n ; ++i)
    {
        __b[i] = b[i];
    }

    playRound(__b, __r);
    std::vector <int> r(n);
    for (int i = 0 ; i < n ; ++i)
    {
        r[i] = __r[i];
    }

    return r;
}

int minValue(int N, int W) 
{
    n = N; w = W;
    std::vector <int> askFor(n, 0);
    askFor[0] = 1;

    std::vector <int> r = play(askFor);
    for (int i = 0 ; i < N ; ++i)
    {
        if (r[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 maxValue(int N, int W) 
{
    n = N; w = W;
    int step = 1;
    std::vector <int> candidates(n);
    std::iota(candidates.begin(), candidates.end(), 0);
    while (candidates.size() > 1)
    {
        std::vector <int> b(n, 0);
        for (const int &pos : candidates)
        {
            b[pos] = w / candidates.size();
        }

        // step = 2 * step;
        std::vector <int> r = play(b);
        std::vector <int> newCandidates;
        for (const int &pos : candidates)
        {
            if (r[pos] > b[pos])
            {
                newCandidates.push_back(pos);
            }
        }

        candidates = newCandidates;
    }

    // TODO: Implement Subtask 2 solution here.
    // You may leave this function unmodified if you are not attempting this
    // subtask.
    return candidates[0];
}

bool cmp(int x, int y)
{
    int times = 0;
    int l = 0, rr = 9, mid;
    while (l + 1 < rr)
    {
        times++;
        mid =  l + (rr - l + 1) / 2;
        std::vector <int> b(n, 0);
        b[x] = b[y] = mid;
    
        std::vector <int> r = play(b);
        if (r[x] > b[x] && r[y] <= b[y]) return false;
        if (r[y] > b[y] && r[x] <= b[x]) return true;
        if (r[x] <= b[x]) rr = mid;
        else l = mid;
    }

    assert(false);
}

int greaterValue(int N, int W) 
{
    n = N; w = W;
    // n = N; w = W;
    // std::vector <int> toAsk(n, 0);
    // toAsk[0] = toAsk[1] = 1;
    // std::vector <int> r = play(toAsk);
    // if ()
    // TODO: Implement Subtask 3 solution here.
    // You may leave this function unmodified if you are not attempting this
    // subtask.
    return cmp(0, 1);
}

bool sigmaCMP(int x, int y)
{
    std::vector <int> b(n, 0);
    b[x] = b[y] = w / 2;
    std::vector <int> r = play(b);
    if (r[x] > w) return false;
    return true;
}

int toSort[MAXN];
int cpy[MAXN];

void sigmaMerge(int l, int r)
{
    if (l == r)
    {
        return;
    }

    int mid = (l + r) / 2;
    sigmaMerge(l, mid);
    sigmaMerge(mid + 1, r);

    int lPtr = l, rPtr = mid + 1, ptr = l;
    while (lPtr <= mid || rPtr <= r)
    {
        if (lPtr == mid + 1)
        {
            cpy[ptr++] = toSort[rPtr++];
            continue;
        }

        if (rPtr == r + 1)
        {
            cpy[ptr++] = toSort[lPtr++];
            continue;
        }

        if (sigmaCMP(toSort[lPtr], toSort[rPtr]))
        {
            cpy[ptr++] = toSort[lPtr++];
        } else
        {
            cpy[ptr++] = toSort[rPtr++];
        }
    }

    for (int i = l ; i <= r ; ++i)
    {
        toSort[i] = cpy[i];
    }
}   

void allValues(int N, int W, int *P) 
{
    n = N; w = W;
    if (W == 2*N) 
    {
        std::iota(toSort, toSort + n, 0);
        sigmaMerge(0, n - 1);
        for (int i = 0 ; i < n ; ++i)
        {
            P[toSort[i]] = i;
        }

    } else {
        // TODO: Implement Subtask 5 solution here.
        // You may leave this block unmodified if you are not attempting this
        // subtask.
    }
}

Compilation message

In file included from /usr/include/c++/10/cassert:44,
                 from koala.cpp:5:
koala.cpp: In function 'std::vector<int> play(const std::vector<int>&)':
koala.cpp:17:21: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   17 |     assert(b.size() == n);
      |            ~~~~~~~~~^~~~
koala.cpp: In function 'int maxValue(int, int)':
koala.cpp:57:9: warning: unused variable 'step' [-Wunused-variable]
   57 |     int step = 1;
      |         ^~~~
# Verdict Execution time Memory Grader output
1 Correct 4 ms 344 KB Output is correct
2 Correct 4 ms 344 KB Output is correct
3 Correct 5 ms 504 KB Output is correct
4 Correct 3 ms 596 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 12 ms 344 KB Output is correct
2 Correct 10 ms 504 KB Output is correct
3 Correct 10 ms 344 KB Output is correct
4 Correct 13 ms 452 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 47 ms 476 KB Output is correct
2 Partially correct 52 ms 472 KB Output is partially correct
3 Correct 42 ms 464 KB Output is correct
4 Correct 45 ms 476 KB Output is correct
5 Partially correct 43 ms 472 KB Output is partially correct
6 Correct 45 ms 596 KB Output is correct
7 Partially correct 47 ms 464 KB Output is partially correct
8 Correct 41 ms 468 KB Output is correct
9 Correct 51 ms 476 KB Output is correct
10 Correct 45 ms 596 KB Output is correct
# Verdict Execution time Memory Grader output
1 Incorrect 18 ms 452 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 0 ms 344 KB Output isn't correct
2 Halted 0 ms 0 KB -