#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define FOR(i,a,b) for(int i = (a); i < (b); ++i) #define FOR2(i,a,b) for(int i = (a); i > (b); --i) //#define FOR(i,b) for(int i = 0; i < (b); ++i) #define FORTO(i,a,b) for(int i = (a); i <= (b); ++i) #define FORD(i,b) for(int i = (b)-1; i >= 0; --i) #define FOREACH(it,a) for(typeof((a).begin()) it = (a).begin(); it != (a).end(); ++it) #define $(x) int((x).size()) inline int two(int n) { return 1 << n; } inline int test(int n, int b) { return n & two(b); } struct Vector { int x, y; int val, len; //hodnota stromu a dlzka plotu Vector(int xx = 0, int yy = 0): x(xx), y(yy) { } Vector operator+(Vector v) const { return Vector(x+v.x, y+v.y); } void operator+=(Vector v) { x += v.x; y += v.y; } Vector operator-(Vector v) const { return Vector(x-v.x, y-v.y); } void operator-=(Vector v) { x -= v.x; y -= v.y; } bool operator<(Vector v) const { return x < v.x || (x == v.x && y < v.y); } double size() const { return sqrt((double)(x*x+y*y)); } } input[20]; inline int cross_product(Vector v1, Vector v2) { return v1.x * v2.y - v1.y * v2.x; } inline int direction(Vector seg1, Vector seg2, Vector point) { return cross_product(point-seg1, seg2-seg1); } double count(const vector & points) { static bool used[20]; if (points.size() < 2) return 0.0; if (points.size() == 2) return 2.0*(points[0]-points[1]).size(); FOR(i, 0, points.size()) used[i] = false; int best = 0; FOR(i, 1, points.size()) if (points[i] < points[best]) best = i; vector hull; hull.push_back(points[best]); used[best] = true; while (1) { int best = 0; FOR(i, 0, points.size()) { int dir = direction(hull.back(), points[best], points[i]); if (dir < 0 || (dir == 0 && (hull.back()-points[best]).size() < (hull.back()-points[i]).size())) best = i; } if (used[best]) break; hull.push_back(points[best]); used[best] = true; } double res = 0.0; FOR(i, 0, hull.size()) res += (hull[i]-hull[(i?i:hull.size())-1]).size(); return res; } int main() { while (1) { int N; scanf("%d", &N); if (!N) break; FOR(i, 0, N) scanf("%d%d%d%d", &input[i].x, &input[i].y, &input[i].val, &input[i].len); int best = 1000000000; FOR(i, 0, two(N)) { int act = 0, len = 0; vector points; FOR(j, 0, N) if (test(i, j)) //pouzity strom { act += input[j].val; len += input[j].len; } else //nepouzity strom points.push_back(input[j]); if (count(points) <= len) best = min(best, act); } printf("The lost value is %d.\n", best); } return 0; }