Ranking (as of 2013-06-08): 444 out of 1351
Language: C++
/* UVa 699 - The Falling Leaves To build using Visual Studio 2008: cl -EHsc -O2 the_falling_leaves.cpp */ #include <iostream> #include <vector> #include <algorithm> using namespace std; struct Tree { int nr_leaves_; int pos_; Tree* left_; Tree* right_; Tree(int nr_leaves, int pos) : nr_leaves_(nr_leaves), pos_(pos), left_(NULL), right_(NULL) {} ~Tree() {delete left_; delete right_;} }; void build_tree(Tree* t, int& min_pos, int& max_pos) { min_pos = min(min_pos, t->pos_); max_pos = max(max_pos, t->pos_); int nr_leaves; cin >> nr_leaves; if (nr_leaves != -1) { t->left_ = new Tree(nr_leaves, t->pos_ - 1); build_tree(t->left_, min_pos, max_pos); } cin >> nr_leaves; if (nr_leaves != -1) { t->right_ = new Tree(nr_leaves, t->pos_ + 1); build_tree(t->right_, min_pos, max_pos); } } void collect_leaves(Tree* t, int pos, vector<int>& piles) { piles[pos + t->pos_] += t->nr_leaves_; if (t->left_) collect_leaves(t->left_, pos, piles); if (t->right_) collect_leaves(t->right_, pos, piles); } int main() { for (int c = 1; ; c++) { int min_pos = 0, max_pos = 0; int nr_leaves; cin >> nr_leaves; if (nr_leaves == -1) break; Tree* root = new Tree(nr_leaves, 0); build_tree(root, min_pos, max_pos); vector<int> piles(max_pos - min_pos + 1, 0); collect_leaves(root, -min_pos, piles); delete root; cout << "Case " << c << ":\n"; for (size_t i = 0, e = piles.size(); i < e; i++) cout << piles[i] << ((i == e - 1) ? '\n' : ' '); cout << endl; } return 0; }
No comments:
Post a Comment