답안 #981328

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
981328 2024-05-13T04:29:53 Z pcc 코알라 (APIO17_koala) C++17
37 / 100
49 ms 600 KB
#include "koala.h"

#include <bits/stdc++.h>

using namespace std;
const int mxn = 110;

int ask[mxn],res[mxn];
int N,W;

void play(int* a,int* b){
	//cerr<<"ASK:"<<endl;for(int i = 0;i<N;i++)cerr<<a[i]<<(i%10 == 9?"\n":" ");cerr<<endl;
	playRound(a,b);
	//cerr<<"RES:"<<endl;for(int i = 0;i<N;i++)cerr<<b[i]<<(i%10 == 9?"\n":" ");cerr<<endl;
}

namespace S1{
	int GO(){
		memset(ask,0,sizeof(ask));
		ask[0] = 1;
		play(ask,res);
		 if(res[0] == 2){
			for(int i = 1;i<N;i++)if(!res[i])return i;
			assert(false);
		}
		else return 0;
		memset(ask,0,sizeof(ask));
		ask[1] = 1;
		play(ask,res);
		for(int i = 2;i<N;i++)if(!res[i])return i;
		assert(false);
		return -1;
	}
}

int minValue(int NN, int WW) {
    // TODO: Implement Subtask 1 solution here.
    // You may leave this function unmodified if you are not attempting this
    // subtask.
	N = NN,W = WW;
	return S1::GO();
}

namespace S2{
	int GO(){
		for(int i = 0;i<N;i++)ask[i] = 1;
		play(ask,res);
		int num = N/2;
		while(num>1){
			int cnt = 0;
			for(int i = 0;i<N;i++)if(res[i]==1)res[i] = 0;
			int val = N/num;
			for(int i = 0;i<N;i++){
				if(res[i])res[i] = val;
			}
			play(res,res);
			num = 0;
			for(int i = 0;i<N;i++){
				num += res[i]>1;
			}
		}
		for(int i = 0;i<N;i++)if(res[i]>=*max_element(res,res+N))return i;
		assert(false);
	}
}

int maxValue(int NN, int WW) {
    // TODO: Implement Subtask 2 solution here.
    // You may leave this function unmodified if you are not attempting this
    // subtask.
	N = NN,W = WW;
	return S2::GO();
}

namespace S3{
	int GO(){

		int l = 1,r = 12;
		while(l != r){
			int mid = (l+r)>>1;
			memset(ask,0,sizeof(ask));
			ask[0] = ask[1] = mid;
			play(ask,res);
			if(res[0]>mid&&res[1]>mid)l = mid+1;
			else if(res[0]<=mid&&res[1]<=mid)r = mid-1;
			else if(res[0]>mid)return 0;
			else if(res[1]>mid)return 1;
		}
		ask[0] = ask[1] = l;
		play(ask,res);
		return (res[0]>l?0:1);

	}
}

int greaterValue(int NN, int WW) {
    // TODO: Implement Subtask 3 solution here.
    // You may leave this function unmodified if you are not attempting this
    // subtask.
	N = NN,W = WW;
	return S3::GO();
}


namespace S5{
	int dp[mxn][mxn];

	bool cmp(int a,int b){
		if(dp[a][b] != -1)return dp[a][b];
		int l = 1,r = 12;
		while(l != r){
			int mid = (l+r)>>1;
			memset(ask,0,sizeof(ask));
			ask[a] = ask[b] = mid;
			play(ask,res);
			if(res[a]>mid&&res[b]>mid)l = mid+1;
			else if(res[a]<=mid&&res[b]<=mid)r = mid-1;
			else if(res[a]>mid)return 0;
			else if(res[b]>mid)return 1;
		}
		memset(ask,0,sizeof(ask));
		ask[a] = ask[b] = l;
		play(ask,res);
		return dp[a][b] = (res[a]>l?0:1);
	}

	int arr[mxn];
	void dc(int l,int r){
		if(l == r)return;
		int mid = (l+r)>>1;
		dc(l,mid);
		dc(mid+1,r);
		vector<int> lv,rv;
		for(int i = l;i<=mid;i++)lv.push_back(arr[i]);
		for(int i = mid+1;i<=r;i++)rv.push_back(arr[i]);
		reverse(lv.begin(),lv.end());
		reverse(rv.begin(),rv.end());
		int pt = l;
		while(!lv.empty()&&!rv.empty()){
			if(cmp(lv.back(),rv.back())){
				arr[pt++] = rv.back();
				rv.pop_back();
			}
			else{
				arr[pt++] = lv.back();
				lv.pop_back();
			}
		}
		while(!lv.empty()){
			arr[pt++] = lv.back();
			lv.pop_back();
		}
		while(!rv.empty()){
			arr[pt++] = rv.back();
			rv.pop_back();
		}
		return;
	}
	void GO(int * P){
		memset(dp,-1,sizeof(dp));
		cerr<<"HI"<<endl;
		for(int i = 0;i<N;i++)arr[i] = i;
		srand(time(NULL));
		random_shuffle(arr,arr+N);
		dc(0,N-1);
		for(int i = 0;i<N;i++)cerr<<arr[i]<<' ';cerr<<endl;
		for(int i = 0;i<N;i++)P[arr[i]] = i+1;
		return;
	}
}

void allValues(int NN, int WW, int *P) {
	N = NN,W = WW;
    if (W == 2*N) {
        // TODO: Implement Subtask 4 solution here.
        // You may leave this block unmodified if you are not attempting this
        // subtask.
    } else {
		S5::GO(P);
		return;
        // TODO: Implement Subtask 5 solution here.
        // You may leave this block unmodified if you are not attempting this
        // subtask.
    }
}

Compilation message

koala.cpp: In function 'int S2::GO()':
koala.cpp:50:8: warning: unused variable 'cnt' [-Wunused-variable]
   50 |    int cnt = 0;
      |        ^~~
koala.cpp: In function 'bool S5::cmp(int, int)':
koala.cpp:124:19: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
  124 |   return dp[a][b] = (res[a]>l?0:1);
      |          ~~~~~~~~~^~~~~~~~~~~~~~~~
koala.cpp: In function 'void S5::GO(int*)':
koala.cpp:166:3: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
  166 |   for(int i = 0;i<N;i++)cerr<<arr[i]<<' ';cerr<<endl;
      |   ^~~
koala.cpp:166:43: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'for'
  166 |   for(int i = 0;i<N;i++)cerr<<arr[i]<<' ';cerr<<endl;
      |                                           ^~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 344 KB Output is correct
2 Correct 3 ms 344 KB Output is correct
3 Correct 3 ms 464 KB Output is correct
4 Correct 4 ms 344 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 11 ms 344 KB Output is correct
2 Correct 11 ms 340 KB Output is correct
3 Correct 11 ms 344 KB Output is correct
4 Correct 10 ms 344 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 37 ms 492 KB Output is correct
2 Correct 48 ms 484 KB Output is correct
3 Correct 36 ms 488 KB Output is correct
4 Correct 49 ms 488 KB Output is correct
5 Correct 36 ms 484 KB Output is correct
6 Correct 35 ms 488 KB Output is correct
7 Correct 47 ms 472 KB Output is correct
8 Correct 44 ms 468 KB Output is correct
9 Correct 46 ms 468 KB Output is correct
10 Correct 41 ms 600 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 344 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 18 ms 504 KB Output isn't correct
2 Halted 0 ms 0 KB -