답안 #828957

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
828957 2023-08-17T21:37:32 Z roseanne_pcy 코알라 (APIO17_koala) C++14
37 / 100
44 ms 344 KB
#include "koala.h"

#include <bits/stdc++.h>

using namespace std;

typedef pair<int, int> ii;
typedef vector<int> vi;
typedef long long ll;

#define f first
#define s second
#define pb push_back
#define lb lower_bound
#define ub upper_bound
#define sz(x) (int)x.size()
#define all(x) begin(x), end(x)

const int MAXN = 105;

int play[MAXN];
int res[MAXN];
int tmp[MAXN];

void reset(int n) {
    for (int i = 0; i< n; i++) {
        play[i] = res[i] = 0;
    }
}

int minValue(int N, int W) {
    int n = N;
    play[0] = 1;
    playRound(play, res);
    for (int i = 0; i < n; i++) {
        if (res[i] == 0) {
            return i;
        }
    }
    reset(N);
    play[1] = 1;
    playRound(play, res);
    for (int i = 0; i < n; i++) {
        if (res[i] == 0) {
            return i;
        }
    }
    return -1;
}

int maxValue(int N, int W) {
    int n = N;
    for (int i = 0; i < n; i++) {
        play[i] = 1;
    }
    playRound(play, res);
    set <int> pots;
    for (int i = 0; i< n; i++) {
        if (res[i] > 0) {
            pots.insert(i);
        }
    }

    int times = 3;
    while(times--) {  
        reset(N);
        for (int x : pots) {
            play[x] = W/(pots.size());
        }

        playRound(play, res);

        set <int> newpots;
        for (int i = 0; i< n; i++) {
            if (res[i] > 0 && (pots.find(i) != pots.end())) {
                newpots.insert(i);
            }
        }
        pots = newpots;
    }
    return *(pots.begin());
}

int greaterValue(int N, int W) {
    int n = N;
    int lo = 1, hi = 14;
    while (lo < hi) {
        int mid = (lo+hi)/2;
        reset(n);
        play[0] = play[1] = mid;
        for (int i = 2; i< n; i++) {
            play[i] = 0;
        }
        playRound(play, res);
        if (res[0] != res[1]) {
            if (res[0] > res[1]) {
                return 0;
            } else {
                return 1;
            }
        } else {
            if (res[0] == 0) {
                hi = mid-1;
            } else {
                lo = mid+1;
            }
        }
    }
}

bool isLessThan(int x, int y, int N) {
    int n = N;
    int lo = 1, hi = 14;
    while (lo < hi) {
        int mid = (lo+hi)/2;
        reset(n);
        play[x] = play[y] = mid;
        playRound(play, res);
        if (res[x] != res[y]) {
            if (res[x] > res[y]) {
                return false;
            } else {
                return true;
            }
        } else {
            if (res[x] == 0) {
                hi = mid-1;
            } else {
                lo = mid+1;
            }
        }
    }
}

void solve(int *P, int L, int R, int N) {
    if (L == R) {
        return;
    }
    // printf("called %d %d\n", L, R);
    int mid = (L+R)/2;
    solve(P, L, mid, N);
    solve(P, mid+1, R, N);

    int i = L, j = mid+1;
    int cur = L;
    while(i <= mid && j <= R) {
        if(isLessThan(P[i], P[j], N)) {
            tmp[cur++] = P[i++];
        } else {
            tmp[cur++] = P[j++];
        }
    }
    while(i <= mid) {
        tmp[cur++] = P[i++];
    }
    while(j <= R) {
        tmp[cur++] = P[j++];
    }

    for (int i = L; i<= R; i++) {
        P[i] = tmp[i];
    }

    return;
}
void sub4(int *P, int sz, int N) {
    solve(P, 0, sz-1, N);
    for (int i = 0; i < sz; i++) {
        tmp[P[i]] = i;
    }
    for (int i = 0; i < sz; i++) {
        P[i] = tmp[i]+1;
    }
}

void allValues(int N, int W, int *P) {
    if (W == 2*N) {
        sub4(P, N, N);
    } else {
        sub4(P, N, N);
        // int n = N;
        // for (int i = 0; i< n; i++) {
        //     play[i] = 1;
        // }
        // playRound(play, res);
        // vector<int> lower, higher;
        // for(int i = 0; i< n; i++) {
        //     if (res[i] == 0) {
        //         lower.push_back(i);
        //     } else {
        //         higher.push_back(i);
        //     }
        // }
        // sub4(P, N);
    }
}

Compilation message

koala.cpp: In function 'int greaterValue(int, int)':
koala.cpp:109:1: warning: control reaches end of non-void function [-Wreturn-type]
  109 | }
      | ^
koala.cpp: In function 'bool isLessThan(int, int, int)':
koala.cpp:133:1: warning: control reaches end of non-void function [-Wreturn-type]
  133 | }
      | ^
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 208 KB Output is correct
2 Correct 3 ms 208 KB Output is correct
3 Correct 3 ms 208 KB Output is correct
4 Correct 3 ms 208 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 11 ms 208 KB Output is correct
2 Correct 11 ms 208 KB Output is correct
3 Correct 11 ms 208 KB Output is correct
4 Correct 11 ms 328 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 34 ms 336 KB Output is correct
2 Correct 44 ms 320 KB Output is correct
3 Correct 33 ms 336 KB Output is correct
4 Correct 33 ms 328 KB Output is correct
5 Correct 35 ms 336 KB Output is correct
6 Correct 36 ms 340 KB Output is correct
7 Correct 33 ms 340 KB Output is correct
8 Correct 40 ms 332 KB Output is correct
9 Correct 34 ms 332 KB Output is correct
10 Correct 33 ms 344 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Runtime error 1 ms 336 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 1 ms 336 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -