본문 바로가기

백준

1057)토너먼트

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


토너먼트에 참가하는 사람 두 명을 지정해주면 그 두 사람이 몇 라운드에서 만나는가를 찾아야 한다.


시뮬레이션 문제라 토너먼트 상황과 비슷하게 문제를 풀었다.


우선 사람 수만큼 배열을 할당하고 지정된 두 사람의 인덱스에 TARGET을 저장한다.


아래 과정은 토너먼트의 각 라운드에 참여하는 사람들의 수가 홀수이냐 짝수이냐에 따라 차이가 있다.


배열을 순차적으로 두 개씩 비교해 두 개 모두가 TARGET이면 그때 라운드 수를 반환하고


하나만 TARGET일 때 임시 인덱스 위치에 TARGET을 저장하고 임시 인덱스를 하나 증가시킨다.


둘다 TARGET이 아니면 임시 인덱스 위치에 NON_TARGET을 저장하고 임시 인덱스를 하나 증가시킨다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include<stdio.h>
#define TARGET 1
#define NON_TARGET 0
 
int main() {
    int N;
    int target1, target2;
    int t = 0;
    int *tournament;
    int isMatching = 0;
    int count = 0;
 
    scanf("%d %d %d",&N,&target1,&target2);
    tournament = (int *)calloc(N,sizeof(int));
    tournament[target1 - 1= TARGET;
    tournament[target2 - 1= TARGET;
 
    
 
    while (!isMatching) {
        count++;
 
        if (N % 2 != 0) {
            for (int i = 0; i < N-1; i += 2) {
                if (tournament[i] + tournament[i + 1== 2) { //hit
                    isMatching = 1;
                    break;
                }
                else if (tournament[i] + tournament[i + 1== 1) tournament[t++= TARGET;
                else tournament[t++= NON_TARGET;
 
            }
            tournament[t] = tournament[N - 1];
            N = N / 2 + 1;
        }
        else {
            for (int i = 0; i < N; i += 2) {
                if (tournament[i] + tournament[i + 1== 2) { //hit
                    isMatching = 1;
                    break;
                }
                else if (tournament[i] + tournament[i + 1== 1) tournament[t++= TARGET;
                else tournament[t++= NON_TARGET;
 
            }
            N /= 2;
        }
        
        t = 0;
    }
    printf("%d\n",count);
 
    system("pause");
    return 0;
}
cs


더 쉬운 방법도 있다.


지정된 참가자가 서로 만나기 전까지 항상 이기면서


다음 라운드에 올라갈 때 번호가 순서대로 다시 부여된다.


지정된 참가자의 번호가 다음 라운드로 올라갔을 때 다시 부여된 사이의 관계는 T2=(T1+1/)2이다.


이것을 이용해서 문제를 풀면 더 쉽게 풀 수 있다.

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

2290)LCD Test  (0) 2019.02.10
9324)진짜 메세지  (0) 2019.02.09
1094)막대기  (0) 2019.02.08
1748)수 이어 쓰기 1  (0) 2019.02.07
5212)지구 온난화  (0) 2019.02.07