Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <algorithm>
- #include <cmath>
- double macos(double x) {
- if (x < -1) x = -1;
- if (x > 1) x = 1;
- return acos(x);
- }
- double area(double a, double b, double c) {
- double p = (a + b + c) * .5;
- return sqrt(p * (p - a) * (p - b) * (p - c));
- }
- double segment(double r, double ang, double s) {
- return .5 * r * r * (ang - s);
- }
- double getArea(double r1, double r2, double r3) {
- double a = r2 + r3;
- double b = r1 + r3;
- double c = r1 + r2;
- double c1 = -(a * a - b * b - c * c) * .5 / b / c;
- double c2 = -(b * b - a * a - c * c) * .5 / a / c;
- double c3 = -(c * c - a * a - b * b) * .5 / a / b;
- double ang1 = macos(c1);
- double ang2 = macos(c2);
- double ang3 = macos(c3);
- double s1 = sin(ang1);
- double s2 = sin(ang2);
- double s3 = sin(ang3);
- double aa = 2 * r1 * sin(ang1 * .5);
- double bb = 2 * r2 * sin(ang2 * .5);
- double cc = 2 * r3 * sin(ang3 * .5);
- return area(aa, bb, cc) - segment(r1, ang1, s1) - segment(r2, ang2, s2) - segment(r3, ang3, s3);
- }
- double getFourth(double r1, double r2, double r3) {
- double l = 0;
- double r = std::min(std::min(r1, r2), r3);
- for (int it = 0; it < 300; it++) {
- double mid = (l + r) * .5;
- if (area(r1 + r2, r1 + mid, r2 + mid) + area(r1 + r3, r1 + mid, r3 + mid) + area(r2 + r3, r2 + mid, r3 + mid) > area(r1 + r2, r1 + r3, r2 + r3)) {
- r = mid;
- } else {
- l = mid;
- }
- }
- return (l + r) * .5;
- }
- int a[12345];
- int main() {
- for (int i = 1; i <= 6; i++) {
- for (int j = i; j <= 6; j++) {
- for (int k = j; k <= 6; k++) {
- printf("%d %d %d %.17lf\n", i, j, k, getFourth(i, j, k));
- }
- }
- }
- return 0;
- int n;
- scanf("%d", &n);
- for (int i = 0; i < n; i++) scanf("%d", a + i);
- if (n > 4) {
- puts("-1");
- return 0;
- }
- std::sort(a, a + n);
- double ans = 0;
- for (int i = 0; i < n; i++) ans += M_PI * a[i] * a[i];
- if (n <= 3) {
- if (n == 3) ans += getArea(a[0], a[1], a[2]);
- printf("%.17lf\n", ans);
- if (n == 3) {
- double r4 = getFourth(a[0], a[1], a[2]);
- int c = getchar();
- while (c <= 32 && c >= 0) c = getchar();
- if (c < 0) return 0;
- printf("%.17lf\n", r4);
- }
- } else if (n == 4) {
- ans = 0;
- for (int i = 1; i < n; i++) ans += M_PI * a[i] * a[i];
- ans += getArea(a[1], a[2], a[3]);
- double r4 = getFourth(a[1], a[2], a[3]);
- double dif = a[0] - r4;
- if (dif < 0) dif = -dif;
- if (dif > 1e-8) puts("-1"); else {
- printf("%.17lf\n", ans);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment