알고리즘 문제

[C/C++ 백준 1057번] 토너먼트 (Silver 3)

새파란 공대생 2020. 7. 7. 22:35

https://www.acmicpc.net/problem/1057

 

1057번: 토너먼트

김지민은 N명이 참가하는 스타 토너먼트에 진출했다. 토너먼트는 다음과 같이 진행된다. 일단 N명의 참가자는 번호가 1번부터 N번까지 배정받는다. 그러고 난 후에 서로 인접한 번호끼리 스타를

www.acmicpc.net

무슨 전략이 있을 것 같은데,, 일단 처음 N명도 조건으로 주어져 꽤 까다로웠다. 마침 브루트포스라는 태그도 있고, 범위도 십만까지이기 때문에 배열을 만들어 김지민과 임한수를 1로 표시하고 계속 지워나가자.

 배열을 2개 단위로 쪼갯을때 1이 연속으로 붙어있다면 break하고 라운드를 출력하면 된다.

 

코드는 다음과 같다.

 

#include <cstdio>
#include <cstring>
int main(void){
	int N, a, b, player[100001], round = 1;
	bool end = false;
	memset(player, 0, 100001*sizeof(int));
	scanf("%d %d %d",&N, &a, &b);
	player[a]=1;
	player[b]=1;
	while(1){
		for(int i=1; i<=N; i+=2){
			if(player[i]==1 && player[i+1]==1){
				end = true;
				break;
			}
			if(player[i]==1 || player[i+1]==1){
				player[i]=0;
				player[i+1]=0;
				player[(i+1)/2]=1;
			}
		}
		N = (N+1)/2;
		if(end)
			break;
		round++;
	}
	printf("%d",round);
}