본문 바로가기

백준

백준1057 - 토너먼트

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

 

1057번: 토너먼트

김지민은 N명이 참가하는 스타 토너먼트에 진출했다. 토너먼트는 다음과 같이 진행된다. 일단 N명의 참가자는 번호가 1번부터 N번까지 배정받는다. 그러고 난 후에 서로 인접한 번호끼리 스타를 한다. 이긴 사람은 다음 라운드에 진출하고, 진 사람은 그 라운드에서 떨어진다. 만약 그 라운드의 참가자가 홀수명이라면, 마지막 번호를 가진 참가자는 다음 라운드로 자동 진출한다. 다음 라운드에선 다시 참가자의 번호를 1번부터 매긴다. 이때, 번호를 매기는 순서는 처음

www.acmicpc.net

간단한 수학 문제다.

a와 b가 토너먼트에서 만나는 라운드를 계산하면 된다.

각 라운드는 홀수번째, 짝수번째가 만나서 싸운다.

매 라운드마다 대결하는 상대끼리 항상 짝수번째 위치가 홀수번째 위치보다 1이 크다.

사람수가 홀수인 경우 마지막 번호는 부전승이다.

홀수번째인 경우는 2로 나눈 몫의 1을 더한 값이 다음 라운드의 번호가 된다.

짝수번째인 경우는 2로 나눈 몫이 다음 라운드의 번호가 된다.

#include <iostream>
using namespace std;

int main() {
	int round = 1;
	int a, b, people; //a의 번호, b의 번호, people은 참여자 수
	cin >> people >> a >> b;
	while (1) {
		if ((a - b == 1 && a % 2 == 0 && b % 2 == 1) || (b - a == 1) && b % 2 == 0 && a % 2 == 1) { //둘의 위치가 1차이면서 짝수의 값이 홀수의 값보다 크면 
			break;
		}
		if (a % 2 == 1) { //a가 홀수인 경우
			a = a / 2 + 1; //a를 2로 나눈 몫의 1을 더한다.
		}
		else { //a가 짝수인 경우
			a = a / 2; //a를 2로 나눈 몫으로 둔다.
		}
		if (b % 2 == 1) { //b가 홀수인 경우
			b = b / 2 + 1; //b를 2로 나눈 몫의 1을 더한다.
		}
		else { //b가 짝수인 경우
			b = b / 2; //b를 2로 나눈 몫으로 둔다.
		}
		round++; //반복문을 돌 때마다 라운드를 1씩 증가한다.
	}
	cout << round;
}

'백준' 카테고리의 다른 글

백준4963 - 섬의 개수  (0) 2019.07.07
백준1966 - 프린터 큐  (0) 2019.07.06
백준1333 - 부재중전화  (0) 2019.07.01
백준1613 - 역사  (0) 2019.06.29
백준1021 - 회전하는 큐  (0) 2019.06.29