#include <math.h>
#include <stdio.h>
#include <stdlib.h>
// (0, ±e, d)
// (±a, ±b, c)
// (±b, ±a, -c)
// (±e, 0, -d)
typedef double scalar;
scalar vol(scalar a, scalar b, scalar c, scalar d) {
scalar e = (a * c - a * d + b * c + b * d) / (2 * c);
if (!(0. <= e && e <= b)) {
return 0.;
}
scalar h4 = hypot(a, d - c);
scalar h53 = hypot(b - e, d - c);
scalar h54 = hypot(a - b, 2 * c);
scalar s0 = ( (b + e) * h4 + a * h53 + (a + b) * h54 ) * 4.;
scalar v0 = ( a * (d - c) * (b * 2. + e) + (a * a + b * b + 4 * a * b) * c ) * ((scalar)4. / (scalar)3.);
scalar s0_i = 1/s0;
scalar r_s0_i = sqrt(s0_i);
scalar v = v0 * r_s0_i * s0_i;
return v;
}
int main() {
scalar v_max = 0.;
scalar a_max = .5;
scalar b_max = .5;
scalar c_max = .5;
scalar d_max = .5;
scalar r = 1.;
for (int i = 0; i < 53; i++) {
for (int j = 0; j < 100; j++) {
scalar a, b, c, d;
do {
a = a_max + (rand() * (1. / RAND_MAX) - .5) * r;
b = b_max + (rand() * (1. / RAND_MAX) - .5) * r;
c = c_max + (rand() * (1. / RAND_MAX) - .5) * r;
d = d_max + (rand() * (1. / RAND_MAX) - .5) * r;
} while (a <= b || c >= d);
scalar v = vol(a, b, c, d);
if (v > v_max) {
v_max = v;
a_max = a;
b_max = b;
c_max = c;
d_max = d;
}
}
r *= .5;
}
printf("%.16f\r\n", vol(a_max, b_max, c_max, d_max));
return 0;
}
I2luY2x1ZGUgPG1hdGguaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCi8vICgwLCDCsWUsIGQpCi8vICjCsWEsIMKxYiwgYykKLy8gKMKxYiwgwrFhLCAtYykKLy8gKMKxZSwgMCwgLWQpCgp0eXBlZGVmIGRvdWJsZSBzY2FsYXI7CgpzY2FsYXIgdm9sKHNjYWxhciBhLCBzY2FsYXIgYiwgc2NhbGFyIGMsIHNjYWxhciBkKSB7CglzY2FsYXIgZSA9IChhICogYyAtIGEgKiBkICsgYiAqIGMgKyBiICogZCkgLyAoMiAqIGMpOwoJaWYgKCEoMC4gPD0gZSAmJiBlIDw9IGIpKSB7CgkJcmV0dXJuIDAuOwoJfQoJc2NhbGFyIGg0ID0gaHlwb3QoYSwgZCAtIGMpOwoJc2NhbGFyIGg1MyA9IGh5cG90KGIgLSBlLCBkIC0gYyk7CglzY2FsYXIgaDU0ID0gaHlwb3QoYSAtIGIsIDIgKiBjKTsKCglzY2FsYXIgczAgPSAoIChiICsgZSkgKiBoNCArIGEgKiBoNTMgKyAoYSArIGIpICogaDU0ICkgKiA0LjsKCXNjYWxhciB2MCA9ICggYSAqIChkIC0gYykgKiAoYiAqIDIuICsgZSkgKyAoYSAqIGEgKyBiICogYiArIDQgKiBhICogYikgKiBjICkgKiAoKHNjYWxhcik0LiAvIChzY2FsYXIpMy4pOwoKCXNjYWxhciBzMF9pID0gMS9zMDsKCXNjYWxhciByX3MwX2kgPSBzcXJ0KHMwX2kpOwoJc2NhbGFyIHYgPSB2MCAqIHJfczBfaSAqIHMwX2k7CglyZXR1cm4gdjsKfQoKaW50IG1haW4oKSB7CglzY2FsYXIgdl9tYXggPSAwLjsKCXNjYWxhciBhX21heCA9IC41OwoJc2NhbGFyIGJfbWF4ID0gLjU7CglzY2FsYXIgY19tYXggPSAuNTsKCXNjYWxhciBkX21heCA9IC41OwoJc2NhbGFyIHIgPSAxLjsKCWZvciAoaW50IGkgPSAwOyBpIDwgNTM7IGkrKykgewoJCWZvciAoaW50IGogPSAwOyBqIDwgMTAwOyBqKyspIHsKCQkJc2NhbGFyIGEsIGIsIGMsIGQ7CgkJCWRvIHsKCQkJCWEgPSBhX21heCArIChyYW5kKCkgKiAoMS4gLyBSQU5EX01BWCkgLSAuNSkgKiByOwoJCQkJYiA9IGJfbWF4ICsgKHJhbmQoKSAqICgxLiAvIFJBTkRfTUFYKSAtIC41KSAqIHI7CgkJCQljID0gY19tYXggKyAocmFuZCgpICogKDEuIC8gUkFORF9NQVgpIC0gLjUpICogcjsKCQkJCWQgPSBkX21heCArIChyYW5kKCkgKiAoMS4gLyBSQU5EX01BWCkgLSAuNSkgKiByOwoJCQl9IHdoaWxlIChhIDw9IGIgfHwgYyA+PSBkKTsKCQkJc2NhbGFyIHYgPSB2b2woYSwgYiwgYywgZCk7CgkJCWlmICh2ID4gdl9tYXgpIHsKCQkJCXZfbWF4ID0gdjsKCQkJCWFfbWF4ID0gYTsKCQkJCWJfbWF4ID0gYjsKCQkJCWNfbWF4ID0gYzsKCQkJCWRfbWF4ID0gZDsKCQkJfQoJCX0KCQlyICo9IC41OwoJfQoJcHJpbnRmKCIlLjE2ZlxyXG4iLCB2b2woYV9tYXgsIGJfbWF4LCBjX21heCwgZF9tYXgpKTsKCXJldHVybiAwOwp9Cg==