⭐每日一题⭐专栏

written by SJTU-XHW

本人学识有限,解析难免有错,恳请读者能够批评指正,本人将不胜感激!


LuoGu P4715. 淘汰赛

题目描述

有 $2^n$($n\le7$)个国家参加世界杯决赛圈且进入淘汰赛环节。已经知道各个国家的能力值,且都不相等。能力值高的国家和能力值低的国家踢比赛时高者获胜。1 号国家和 2 号国家踢一场比赛,胜者晋级。3 号国家和 4 号国家也踢一场,胜者晋级……晋级后的国家用相同的方法继续完成赛程,直到决出冠军。给出各个国家的能力值,请问亚军是哪个国家?

说明

输入格式

第一行一个整数 $n$,表示一共 $2^n$ 个国家参赛。

第二行 $2^n$ 个整数,第 $i$ 个整数表示编号为 $i$ 的国家的能力值($1\leq i \leq 2^n$)。

数据保证不存在平局。

输出格式

仅一个整数,表示亚军国家的编号。

样例 1 输入

1
2
3
4 2 3 1 10 5 9 7

样例 1 输出

1
1

思路

嗯,这题一开始这么想的,比较的方法比较“呆”,就是找出第二名,那么只要知道最后一轮的情况就行;按照题干的比较方法,必然是前 $2^{n-1}$ 个队决出一个胜者、后 $2^{n-1}$ 个队再决出一个胜者;所以,找前 $2^{n-1}$ 和后 $2^{n-1}$ 个数中的最大值,再找出这两个数的最小值即可;时间 $O(n)$,空间 $O(1)$;

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
using namespace std;

int main() {
int n, num; cin >> n;
if (n <= 0) { cout << -1; return 0; }
num = (1 << n - 1);
int max1 = -1, max2 = -1, maxIdx1 = 0, maxIdx2 = num, tmp;
for (int i = 0; i < num; ++i) {
cin >> tmp;
if (tmp > max1) { max1 = tmp; maxIdx1 = i; }
}
for (int i = num; i < 2 * num; ++i) {
cin >> tmp;
if (tmp > max2) { max2 = tmp; maxIdx2 = i; }
}
cout << (max1 < max2 ? maxIdx1 + 1 : maxIdx2 + 1);
return 0;
}

然后就通过了;


评论
昼夜切换阅读模式