二叉树P4715 深基16.例1淘汰赛数塔思想
Posted jason66661010
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树P4715 深基16.例1淘汰赛数塔思想相关的知识,希望对你有一定的参考价值。
题目
https://www.luogu.com.cn/problem/P4715
分析
这道题我是使用了动态规划思想的数塔的做法,从数塔底层开始比较,一层一层网上找,找到第二层在比较找出亚军(数组的最低维来表示index与国家的能力值)
但是最简单的思路:么的把 n 支队伍分成两个区间,一个上半区,一个下半区。那么上半区最强者与下半区最强者,必是一冠一亚。
代码
#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; int list[200][200][2]; int temp[200][2]; int main() { int n; scanf("%d", &n); int amount = pow(2, n); n++; for (int i = 1; i <= amount; i++) { int t; scanf("%d", &t); temp[i][1] = i; temp[i][0]=t; } for (int j = 1; j <= amount; j++) { list[n][j][0] = temp[j][0]; list[n][j][1] = temp[j][1]; } for (int i = n; i > 2; i--) for (int j = 1; j <= pow(2, i-1); j += 2) { if (list[i][j][0] > list[i][j+1][0]) { list[i - 1][(j+1)/2][0] = list[i][j][0]; list[i - 1][(j+1)/2][1] = list[i][j][1]; } else { list[i - 1][(j+1)/2][0] = list[i][j+1][0]; list[i - 1][(j+1)/2][1] = list[i][j+1][1]; } } if (list[2][1][0] > list[2][2][0])printf("%d", list[2][2][1]); else printf("%d", list[2][1][1]); }
以上是关于二叉树P4715 深基16.例1淘汰赛数塔思想的主要内容,如果未能解决你的问题,请参考以下文章