Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
模拟题,注意计数的时候,应该先数左子树的种类数。#include<iostream> #include<vector> std::vector<size_t> kind_node; std::vector<size_t> kind_node_left; class Tree { public: Tree(){}; ~Tree(){}; size_t order_num; }; std::istream& operator>>(std::istream& is,Tree& tree) { is >> tree.order_num; return is; } int main() { void Compute_kind_node(std::vector<size_t>&, std::vector<size_t>&); void Print(const int&, const size_t&); Tree instance; int nodes; size_t kinds; Compute_kind_node(kind_node,kind_node_left); while (std::cin>>instance, instance.order_num != 0){ instance.order_num++; nodes = 0; while (instance.order_num > kind_node_left[++nodes]); kinds = instance.order_num - kind_node_left[nodes - 1]; Print(nodes,kinds); std::cout << std::endl; } } void Compute_kind_node(std::vector<size_t>& kind_node, std::vector<size_t>& kind_node_left) { kind_node.push_back(1); kind_node.push_back(1); for (int i = 2; i <= 18; ++i){ kind_node.push_back(0); for (int j = 0; j <= i - 1; ++j) kind_node[i] += kind_node[j] * kind_node[i - j - 1]; } for (int i = 0; i <= 18; ++i){ kind_node_left.push_back(0); for (int j = 0; j <= i; ++j) kind_node_left[i] += kind_node[j]; } } void Print(const int& nodes, const size_t& kinds) { if (nodes){ int nodes_left = 0; int nodes_right = nodes - 1; size_t kinds_left; size_t kinds_right; size_t sum = kind_node[nodes_left]*kind_node[nodes_right]; while (sum < kinds){ sum += kind_node[++nodes_left] * kind_node[--nodes_right]; } sum -= kind_node[nodes_left] * kind_node[nodes_right]; sum = kinds - sum; kinds_left = sum % kind_node[nodes_right] ? sum / kind_node[nodes_right] + 1 : sum / kind_node[nodes_right]; kinds_right = sum % kind_node[nodes_right] ? sum % kind_node[nodes_right] : kind_node[nodes_right]; if (nodes_left != 0){ std::cout << "("; Print(nodes_left, kinds_left); std::cout << ")"; } std::cout << "X"; if (nodes_right != 0){ std::cout << "("; Print(nodes_right, kinds_right); std::cout << ")"; } } } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator