static int K;
static int tables[2][100000];
static int cnt[] = { 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024 };
static int solution(void)
{
int n, loop, turn = 0, tot = 0;
scanf("%d", &K);
for (int i = 0; i < cnt[K]; i++)
scanf("%d", &tables[0][i]);
n = cnt[K];
loop = cnt[K] / 2;
while (loop > 0)
{
for (int i = 0, j = 0; i < n; i += 2)
{
if (tables[turn][i] > tables[turn][i + 1])
{
tables[1 - turn][j++] = tables[turn][i];
tot += (tables[turn][i] - tables[turn][i + 1]);
}
else
{
tables[1 - turn][j++] = tables[turn][i + 1];
tot += (tables[turn][i + 1] - tables[turn][i]);
}
}
loop /= 2;
n /= 2;
turn = 1 - turn;
}
return tot;
}
매 토너먼트 시 참가자의 수는 해당 회차전에서 둘 중 하나만 다음라운드로 진출하기 때문에 절반씩 줄어드는 것은 당연한다.
남은 건 최대 몇 라운드 까지 토너먼트가 진행 되는 지 이다.
참가자 수가 2^K 명 일 때, K라운드 까지만 하면 된다.
코드 나누기 2로 해서 2의 지수 승을 낮추는 것 처럼 되어 있는데, loop = K - 1; 로 하고, loop -= 1; 그 카운트를 낮추는 것이 더 효율적이다. 이 부분은 처음 코딩 할 때 중간에 착각했던 것 같다.
'알고리즘 > SWEA' 카테고리의 다른 글
5644. 무선 충전 (0) | 2021.11.09 |
---|---|
5650. 핀볼게임 (0) | 2021.11.08 |
2112 (0) | 2021.11.08 |
8659 (0) | 2021.11.08 |
8658 (0) | 2021.11.08 |