제출 #261469

#제출 시각아이디문제언어결과실행 시간메모리
261469Kastanda코알라 (APIO17_koala)C++11
100 / 100
79 ms632 KiB
// M
#include<bits/stdc++.h>
#include "koala.h"
using namespace std;
const int N = 109;
int B[N], R[N];

int minValue(int n, int W)
{
        for (int i = 0; i < n; i ++)
                B[i] = 1;
        playRound(B, R);
        int id = -1;
        for (int i = 0; i < n; i ++)
                if (R[i] > 1)
                        id = i;
        assert(id != -1);
        memset(B, 0, sizeof(B));
        B[id] = 1;
        playRound(B, R);
        for (int i = 0; i < n; i ++)
                if (!R[i])
                        return i;
}

int maxValue(int n, int W)
{
        vector < int > Cnds;
        for (int i = 0; i < n; i ++)
                Cnds.push_back(i);
        while (Cnds.size() > 1)
        {
                memset(B, 0, sizeof(B));
                for (int a : Cnds)
                        B[a] = W / (int)Cnds.size();
                playRound(B, R);
                vector < int > TbC;
                for (int a : Cnds)
                        if (R[a] > B[a])
                                TbC.push_back(a);
                Cnds.swap(TbC);
                TbC.clear();
        }
        assert(Cnds.size());
        return Cnds[0];
}

int greaterValue(int n, int W)
{
        int le = 0, ri = min(11, W / 2), md;
        while (ri - le > 1)
        {
                md = (le + ri) >> 1;
                memset(B, 0, sizeof(B));
                B[0] = md; B[1] = md;
                playRound(B, R);
                int w0 = R[0] > md, w1 = R[1] > md;
                if (w0 && !w1)
                        return 0;
                if (w1 && !w0)
                        return 1;
                if (w0 && w1)
                        le = md;
                else
                        ri = md;
        }
}

inline bool TestRound(int l, int r, int n, int W, int Cw)
{
        if (Cw * (r - l + 1) > W)
                return 0;
        memset(B, 0, sizeof(B));
        for (int i = 0; i < n; i ++)
                B[i] = 0;
        for (int i = l; i <= r; i ++)
                B[i - 1] = Cw;

        int ORGP[210];
        for (int i = 0; i < n; i ++)
                ORGP[i] = i + 1;

    int i, j;

    int cache[2][205];
    int num[2][205];
    char taken[105][205];

    for (i=0;i<205;++i) {
        cache[1][i] = 0;
        num[1][i] = 0;
    }

    for (i=0;i<n;++i) {
        int v = B[i]+1;
        int ii = i&1;
        int o = ii^1;
        for (j=0;j<=W;++j) {
            cache[ii][j] = cache[o][j];
            num[ii][j] = num[o][j];
            taken[i][j] = 0;
        }
        for (j=W;j>=v;--j) {
            int h = cache[o][j-v] + ORGP[i];
            int hn = num[o][j-v] + 1;
            if (h > cache[ii][j] || (h == cache[ii][j] && hn > num[ii][j])) {
                cache[ii][j] = h;
                num[ii][j] = hn;
                taken[i][j] = 1;
            } else {
                taken[i][j] = 0;
            }
        }
    }

    int cur = W;
    for (i=n-1;i>=0;--i) {
        R[i] = taken[i][cur] ? (B[i] + 1) : 0;
        cur -= R[i];
    }

        int Pkd = 0;
        for (int i = l; i <= r; i ++)
                if (R[i - 1] > B[i - 1])
                        Pkd ++;
        if (Pkd == 0 || Pkd == r - l + 1)
                return 0;
        return 1;
}

void Solve(int l, int r, vector < int > A, int n, int W, int * P)
{
        if (r < l)
                return ;
        if (l == r)
                return void(P[A[0]] = l);


        int w = W / n;
        int Cw = W;
        /*for (int i = r + 1; i <= n; i ++)
                B[i] = w - 1, Cw -= B[i];*/
        Cw /= (r - l + 1);
        while (Cw && !TestRound(l, r, n, W, Cw))
                Cw --;
        assert(Cw);

        memset(B, 0, sizeof(B));
        for (int i : A)
                B[i] = Cw;

        playRound(B, R);
        vector < int > Le, Ri;
        for (int i : A)
        {
                if (R[i] > B[i])
                        Ri.push_back(i);
                else
                        Le.push_back(i);
        }

        /*printf("Left, from %d to %d is : ", l, l + (int)Le.size() - 1);
        for (int a : Le) printf("%d ", a); printf("\n");

        printf("Right, from %d to %d is : ", l + (int)Le.size(), r);
        for (int a : Ri) printf("%d ", a); printf("\n");*/

        Solve(l, l + (int)Le.size() - 1, Le, n, W, P);
        Solve(l + (int)Le.size(), r, Ri, n, W, P);
        return ;
}

void allValues(int n, int W, int * P)
{
        vector < int > A;
        for (int i = 0; i < n; i ++)
                A.push_back(i);
        Solve(1, n, A, n, W, P);
}

컴파일 시 표준 에러 (stderr) 메시지

koala.cpp: In function 'void Solve(int, int, std::vector<int>, int, int, int*)':
koala.cpp:139:13: warning: unused variable 'w' [-Wunused-variable]
         int w = W / n;
             ^
koala.cpp: In function 'int minValue(int, int)':
koala.cpp:24:1: warning: control reaches end of non-void function [-Wreturn-type]
 }
 ^
koala.cpp: In function 'int greaterValue(int, int)':
koala.cpp:67:1: warning: control reaches end of non-void function [-Wreturn-type]
 }
 ^
#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...