알고리즘 문제
[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);
}