static double[] xx;
static double[] yy;
static double[] w;
static double maxx, minx, maxy, miny;
static double k = 0.000001;
public static double calsum(double x, double y) {
double sum = 0;
for (int i = 0; i < xx.length; i++) {
sum += Math.max(Math.abs(x - xx[i]), Math.abs(y - yy[i])) * w[i];
}
return sum;
}
public static double solvex(double x) {
double l = miny, r = maxy;
while (r - l >= k) {
double m1 = l + (r - l) / 3, m2 = l + 2 * (r - l) / 3;
if (calsum(x, m1) <= calsum(x, m2)) {
r = m2;
} else {
l = m1;
}
}
return calsum(x, l);
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int T = in.nextInt();
for (int t = 0; t < T; t++) {
int N = in.nextInt();
xx = new double[N];
yy = new double[N];
w = new double[N];
maxx = -1001;
maxy = -1001;
minx = 1001;
miny = 1001;
for (int n = 0; n < N; n++) {
xx[n] = in.nextDouble();
yy[n] = in.nextDouble();
w[n] = in.nextDouble();
maxx = Math.max(maxx, xx[n]);
minx = Math.min(minx, xx[n]);
maxy = Math.max(maxy, yy[n]);
miny = Math.min(miny, yy[n]);
}
double l = minx, r = maxx;
while (r - l >= k) {
double m1 = l + (r - l) / 3, m2 = l + 2 * (r - l) / 3;
if (solvex(m1) <= solvex(m2)) {
r = m2;
} else {
l = m1;
}
}
double re = solvex(l);
System.out.printf("Case #%d: %.7f\n", (t + 1), re);
}
}
三分搜索,第一次听说。