数算!
This commit is contained in:
1 parent
ca6daa582c
commit
e0c09e0c7b
22 files changed
+1344
-105
No files matched your search
@@ -0,0 +1,62 @@
|
||||
#include <cmath>
|
||||
#include <functional>
|
||||
#include <iostream>
|
||||
|
||||
class BinaryTree {
|
||||
public:
|
||||
struct Node {
|
||||
int value = -1;
|
||||
Node *father = nullptr, *left = nullptr, *right = nullptr;
|
||||
int depth = -1;
|
||||
};
|
||||
|
||||
Node* root = new Node({.depth = 0});
|
||||
|
||||
void init_full_tree(int height, const std::function<bool(int, int)>& comp) {
|
||||
int id = 0;
|
||||
return init_full_tree(height, comp, 0, nullptr, id);
|
||||
}
|
||||
|
||||
protected:
|
||||
void init_full_tree(int height, const std::function<bool(int, int)>& comp,
|
||||
int current_depth, Node* current_node, int& id) {
|
||||
if (current_depth == 0) { current_node = root; }
|
||||
if (current_depth == height) {
|
||||
current_node->value = id++;
|
||||
return;
|
||||
}
|
||||
current_node->left = new Node();
|
||||
current_node->right = new Node();
|
||||
init_full_tree(height, comp, current_depth + 1, current_node->left, id);
|
||||
init_full_tree(height, comp, current_depth + 1, current_node->right, id);
|
||||
if (comp(current_node->left->value, current_node->right->value)) {
|
||||
current_node->value = current_node->right->value;
|
||||
} else {
|
||||
current_node->value = current_node->left->value;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
int main() {
|
||||
std::ios::sync_with_stdio(false);
|
||||
std::cin.tie(nullptr);
|
||||
|
||||
int n;
|
||||
BinaryTree binary_tree;
|
||||
std::vector<int> strengths;
|
||||
std::cin >> n;
|
||||
strengths.resize(static_cast<std::size_t>(std::pow(2, n)));
|
||||
for (int& strength : strengths) { std::cin >> strength; }
|
||||
binary_tree.init_full_tree(n,
|
||||
[strengths](int i, int j) {
|
||||
return strengths[i] < strengths[j];
|
||||
});
|
||||
// std::cout << binary_tree.root->value << std::endl;
|
||||
int gold = binary_tree.root->value;
|
||||
int silver = binary_tree.root->left->value == gold
|
||||
? binary_tree.root->right->value
|
||||
: binary_tree.root->left->value;
|
||||
std::cout << silver + 1 << std::endl;
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in new issue
Block a user