#include #include using namespace std; typedef unsigned long long Uint; typedef signed long long Sint; struct STree { Sint x, y; Uint value; Uint length; }; struct SForest { vector trees; Uint length; Uint value; }; SForest *optimal; void Calculate(SForest &forest) { Uint num_trees = forest.trees.size(); if(num_trees == 1) return; for(Uint i = 0; i < num_trees; i++) { SForest *n = new SForest; SForest &new_forest = *n; for(Uint j = 0; j < num_trees; j++) { if(i == j) continue; new_forest.trees.push_back(forest.trees.at(j)); } new_forest.length = forest.length + forest.trees.at(i).length; new_forest.value = forest.value + forest.trees.at(i).value; Sint min_x, max_x, min_y, max_y; min_x = new_forest.trees.at(0).x; min_y = new_forest.trees.at(0).y; max_x = min_x; max_y = min_y; for(Uint j = 0; j < num_trees-1; j++) { Sint x = new_forest.trees.at(j).x; Sint y = new_forest.trees.at(j).y; if(x < min_x) min_x = x; if(x > max_x) max_x = x; if(y < min_y) min_y = y; if(y > max_y) max_y = y; } Sint width = max_x - min_x; Sint height = max_y - min_y; Uint needed_length = width * 2 + height * 2; bool call = false; if(new_forest.length >= needed_length) { if(optimal == NULL) optimal = n; else if(optimal->value > new_forest.value) { delete optimal; optimal = n; } else call = true; } else call = true; if(call) { Calculate(*n); delete n; } } } int main() { while(true) { Uint num_trees; cin >> num_trees; if(!num_trees) break; SForest forest; forest.trees.resize(num_trees); forest.length = 0; forest.value = 0; optimal = NULL; for(Uint i = 0; i < num_trees; i++) { STree &tree = forest.trees.at(i); cin >> tree.x >> tree.y >> tree.value >> tree.length; } Calculate(forest); cout << optimal->value << endl; delete optimal; optimal = NULL; } return 0; }