奇怪的思路增加了
查看原帖
奇怪的思路增加了
389540
imfkwk楼主2021/1/28 00:09

首先定义结构体,存好队伍编号和实力。

struct t{
	int p;
	int nu;
}te[520];

然后这么做:进行 n - 1 次循环,每次循环之中

  • 把 te[1] 和 te[2] 比较,并把结果存储到 te[1] 中

  • 把 te[3] 和 te[4] 比较,并把结果存储到 te[2] 中

  • 以此类推

这样一来,每一次循环过后数组的有效长度都会缩短为原来的一半,而且满足题意。

当长度缩短为 2 的时候,比较 te[1] 和 te[2] 并且输出就行了。

虽然我说的很清楚,但是我的码还是没过。求助。

以下是代码:

#include <bits/stdc++.h>
using namespace std;

struct t{
	int p;
	int nu;
}te[520];

int n;

int main(void) {
	scanf("%d", &n);
	
	for (int i = 1; i <= pow(2, n); i++) {
		scanf("%d", &te[i].p);
		te[i].nu = i;
	}
	
	for (int i = 3; i >= 2; i--) {
		for (int j = 1; j <= pow(2, i); j += 2) {
			if (te[j].p > te[j + 1].p) {
				te[(j + 1)/2] = te[j];
				
			} else {
				te[(j + 1)/2] = te[j + 1];
			}
		}
	}
	
	if (te[1].p > te[2].p) printf("%d", te[2].nu);
	else printf("%d", te[1].nu);
	
	return 0;
}
2021/1/28 00:09
加载中...