제출 #1352701

#제출 시각아이디문제언어결과실행 시간메모리
1352701thelegendary08코알라 (APIO17_koala)C++20
74 / 100
25 ms464 KiB
#include "koala.h"
#define f0r(i,n) for(int i = 0; i < n; i++)
#define dout(x) cout<<x<<' '<<#x<<endl
#define dout2(x,y) cout<<x<<' '<<#x<<' '<<y<<' '<<#y<<endl
#define vout(v) cout<<#v<<": "; for(auto u : v)cout<<u<<' '; cout<<endl
#include<bits/stdc++.h>
using namespace std;

int minValue(int N, int W) {
    // TODO: Implement Subtask 1 solution here.
    // You may leave this function unmodified if you are not attempting this
    // subtask.
    int round[N];
    round[0] = 1;
    for(int i = 1;i<N;i++)round[i] = 0;
    int ret[N];
    playRound(round, ret);
    bool isfirst = 1;
    int zero = 0;
    for(int i = 0;i<N;i++){
        if(ret[i] == 2){
            isfirst = 0;
        }
        if(ret[i] == 0)zero = i;
    }
    if(isfirst)return 0;
    else return zero;
}

int maxValue(int N, int W) {
    int poss = N;
    vector<bool>can(N, true);
    while(poss > 1){
        int num = W/poss;
        int quer[N];
        for(int i = 0;i<N;i++){
            if(can[i])quer[i] = num;
            else quer[i] = 0;
        }
        int ret[N];
        playRound(quer, ret);
        for(int i = 0;i<N;i++){
            if(ret[i] == 0 && can[i])can[i] = 0;
        }
        poss = 0;
        for(int i = 0;i<N;i++){
            if(can[i])poss++;
        }
    }
    int ans = 0;
    for(int i = 0;i<N;i++){
        if(can[i])ans = i;
    }
    return ans;
}

int greaterValue(int N, int W) {
    // TODO: Implement Subtask 3 solution here.
    // You may leave this function unmodified if you are not attempting this
    // subtask.
    int quer[N];
    quer[0] = 5;
    quer[1] = 5;
    for(int i = 2;i<N;i++)quer[i] = 0;
    int ret[N];
    playRound(quer, ret);
    if(ret[0] == 0 && ret[1] != 0)return 1;
    else if(ret[0] != 0 && ret[1] == 0)return 0;
    else{
        if(ret[0] == 0){
            quer[0] = 2;
            quer[1] = 2;
            playRound(quer, ret);
            if(ret[0] == 0 && ret[1] != 0)return 1;
            else if(ret[0] != 0 && ret[1] == 0)return 0;
            else{
                if(ret[0] == 0){
                    quer[0] = 1;
                    quer[1] = 1;
                    playRound(quer, ret);
                    if(ret[0] == 0 && ret[1] != 0)return 1;
                    else return 0;
                }
                else{
                    quer[0] = 3;
                    quer[1] = 3;
                    playRound(quer, ret);
                    if(ret[0] == 0 && ret[1] != 0)return 1;
                    else return 0;
                }
            }
        }
        else{
            quer[0] = 8;
            quer[1] = 8;
            playRound(quer, ret);
            if(ret[0] == 0 && ret[1] != 0)return 1;
            else return 0;
        }
    }
    return 0;
}

void allValues(int N, int W, int *P) {
    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.
        set<int>s; for(int i = 0; i < N; i++)s.insert(i); int quer[N], ret[N]; int qrs = 0; 
        for(int tt = N; tt >= 2; tt--){
        	vector<bool>can(N); for(auto u : s)can[u] = 1; 
        	while(1){
        		int cnt = 0; f0r(i,N)if(can[i])cnt++; if(cnt <= 1){break;}
        		int L = tt - cnt + 1, R = tt; //dout2(L,R);
        		int mx = 1e9, mxd = 0; for(int num = 2; num <= 51; num++)if((R - L + 1) * (num-1) <= tt){
        			int ptr = L-1, good = 0, cur = tt, p2 = R; while(cur > 0){
        				if(cur < num){
        					break;
        				}
        				if(p2 < L)break;
        				int ct1 = 0, pt = 0; for(int i = ptr; i > max({0, ptr - num, ptr - cur}); i--){
        					ct1 += i; pt++;
        				} 
        				
        				int ct2 = p2; 
        				if(ct2 > ct1){
        					good++, p2--; cur -= num; 
        				}
        				else{
        					cur--; ptr--;
        				}
        			} //dout2(num,good);
        			if(good > 0 && good < mx)mx = good, mxd = num; 
        		} 
        		int d = mxd; //dout(d);
        		f0r(i,N)quer[i]=0; f0r(i,N)if(can[i])quer[i]=d-1; playRound(quer,ret); //vout(quer); vout(ret);
        		f0r(i,N)if(can[i] && ret[i] <= quer[i])can[i]=0;
        	} 
        	f0r(i,N)if(can[i])s.erase(i), P[i] = tt; 
        }
        P[*s.begin()] = 1; 
    }
}
#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...