답안 #653823

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
653823 2022-10-28T11:06:23 Z blue 코알라 (APIO17_koala) C++17
37 / 100
49 ms 340 KB
#include "koala.h"
#include <bits/stdc++.h>
using namespace std;
 
using vi = vector<int>;
using vvi = vector<vi>;
#define sz(x) int(x.size())
 
int N;
 
vi playRound(vi BV)
{
    int B[N];
    int R[N];
    for(int i = 0; i < N; i++)
    {
        B[i] = BV[i];
    }
    playRound(B, R);
 
    vi RV(N);
    for(int i = 0; i < N; i++)
        RV[i] = R[i];
 
    return RV;
}
 
int minValue(int N_, int W) {
    N = N_;
    
    vi B(N, 0);
    B[0] = 1;
    vi R = playRound(B);
 
    for(int i = 0; i < N; i++)
        if(R[i] == 0)
            return i;
 
    return 0;
}
 
int maxValue(int N_, int W) {
    N = N_;
   
    vi cand;
    for(int i = 0; i < N; i++)
        cand.push_back(i);
 
    while(sz(cand) > 1)
    {
        int toput = W / sz(cand);
 
        vi B(N, 0);
        for(int i : cand)
            B[i] = toput;
 
        vi R = playRound(B);
 
        vi newcand;
 
        for(int i = 0; i < N; i++)
        {
            if(B[i] > 0 && R[i] > B[i])
                newcand.push_back(i);
        }
        cand = newcand;
    }
 
    return cand[0];
}
 
bool cmp(int a, int b, int W)
{
    int lo = 1;
    int hi = 14;
 
    while(true)
    {
        int mid = (lo+hi)/2;
 
        vi B(N, 0);
        B[a] = B[b] = mid;
 
        vi R = playRound(B);
 
        vi taken(N, 0);
        for(int i = 0; i < N; i++)
            if(R[i] > B[i])
                taken[i] = 1;
 
        if(taken[a] && !taken[b])
            return 0;
 
        if(taken[b] && !taken[a])
            return 1;
 
        if(taken[a])
            lo = mid+1;
        else
            hi = mid-1;
    }
}
 
int greaterValue(int N_, int W) {
    N = N_;
    
    // int lo = 1, hi = 30;
    // while(lo != hi)
    // {
    //     int mid = (lo+hi)/2;
 
    //     vi B(N, 0);
    //     B[0] = B[1] = mid;
 
    //     vi R = playRound(B);
 
    //     vi taken(N, 0);
    //     for(int i = 0; i < N; i++)
    //         if(R[i] > B[i])
    //             taken[i] = 1;
 
    //     if(taken[0] && !taken[1])
    //         return 0;
 
    //     if(taken[1] && !taken[0])
    //         return 1;
 
    //     if(taken[1] && taken[0])
    //         lo = mid+1;
    //     else
    //         hi = mid-1;
    // }
 
    // return -1;
    if(cmp(0, 1, W))
        return 1;
    else
        return 0;
}
 
void allValues(int N_, int W, int *P_) {
    N = N_;
 
    vi P(N);
    for(int i = 0; i < N; i++)
        P[i] = P_[i];
 
    if (W == 2*N) {
        // TODO: Implement Subtask 4 solution here.
        // You may leave this block unmodified if you are not attempting this
        // subtask.
    } else {
        // TODO: Implement Subtask 5 solution here.
        // You may leave this block unmodified if you are not attempting this
        // subtask.
    }
}
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 208 KB Output is correct
2 Correct 5 ms 208 KB Output is correct
3 Correct 5 ms 208 KB Output is correct
4 Correct 5 ms 208 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 13 ms 320 KB Output is correct
2 Correct 12 ms 320 KB Output is correct
3 Correct 14 ms 336 KB Output is correct
4 Correct 13 ms 324 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 44 ms 340 KB Output is correct
2 Correct 49 ms 316 KB Output is correct
3 Correct 47 ms 336 KB Output is correct
4 Correct 49 ms 336 KB Output is correct
5 Correct 39 ms 336 KB Output is correct
6 Correct 43 ms 332 KB Output is correct
7 Correct 49 ms 332 KB Output is correct
8 Correct 42 ms 332 KB Output is correct
9 Correct 47 ms 328 KB Output is correct
10 Correct 43 ms 336 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 208 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 208 KB Output isn't correct
2 Halted 0 ms 0 KB -