niyaznigmatullin

Untitled

Jan 28th, 2014
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.53 KB | None | 0 0
  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <cmath>
  4.  
  5. double macos(double x) {
  6.   if (x < -1) x = -1;
  7.   if (x > 1) x = 1;
  8.   return acos(x);
  9. }
  10.  
  11. double area(double a, double b, double c) {
  12.   double p = (a + b + c) * .5;
  13.   return sqrt(p * (p - a) * (p - b) * (p - c));
  14. }
  15.  
  16. double segment(double r, double ang, double s) {
  17.   return .5 * r * r * (ang - s);
  18. }
  19.  
  20. double getArea(double r1, double r2, double r3) {
  21.   double a = r2 + r3;
  22.   double b = r1 + r3;
  23.   double c = r1 + r2;
  24.   double c1 = -(a * a - b * b - c * c) * .5 / b / c;
  25.   double c2 = -(b * b - a * a - c * c) * .5 / a / c;
  26.   double c3 = -(c * c - a * a - b * b) * .5 / a / b;  
  27.   double ang1 = macos(c1);
  28.   double ang2 = macos(c2);
  29.   double ang3 = macos(c3);
  30.   double s1 = sin(ang1);
  31.   double s2 = sin(ang2);
  32.   double s3 = sin(ang3);
  33.   double aa = 2 * r1 * sin(ang1 * .5);
  34.   double bb = 2 * r2 * sin(ang2 * .5);
  35.   double cc = 2 * r3 * sin(ang3 * .5);
  36.   return area(aa, bb, cc) - segment(r1, ang1, s1) - segment(r2, ang2, s2) - segment(r3, ang3, s3);
  37. }
  38.  
  39. double getFourth(double r1, double r2, double r3) {
  40.   double l = 0;
  41.   double r = std::min(std::min(r1, r2), r3);
  42.   for (int it = 0; it < 300; it++) {
  43.     double mid = (l + r) * .5;
  44.     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)) {
  45.       r = mid;
  46.     } else {
  47.       l = mid;
  48.     }
  49.   }
  50.   return (l + r) * .5;
  51. }
  52.  
  53. int a[12345];
  54.  
  55. int main() {
  56.   for (int i = 1; i <= 6; i++) {
  57.     for (int j = i; j <= 6; j++) {
  58.       for (int k = j; k <= 6; k++) {
  59.         printf("%d %d %d %.17lf\n", i, j, k, getFourth(i, j, k));
  60.       }
  61.     }
  62.   }
  63.   return 0;
  64.   int n;
  65.   scanf("%d", &n);
  66.   for (int i = 0; i < n; i++) scanf("%d", a + i);
  67.   if (n > 4) {
  68.     puts("-1");
  69.     return 0;
  70.   }
  71.   std::sort(a, a + n);
  72.   double ans = 0;
  73.   for (int i = 0; i < n; i++) ans += M_PI * a[i] * a[i];
  74.   if (n <= 3) {
  75.     if (n == 3) ans += getArea(a[0], a[1], a[2]);
  76.     printf("%.17lf\n", ans);
  77.     if (n == 3) {
  78.       double r4 = getFourth(a[0], a[1], a[2]);
  79.       int c = getchar();
  80.       while (c <= 32 && c >= 0) c = getchar();
  81.       if (c < 0) return 0;
  82.       printf("%.17lf\n", r4);
  83.     }
  84.   } else if (n == 4) {
  85.     ans = 0;
  86.     for (int i = 1; i < n; i++) ans += M_PI * a[i] * a[i];        
  87.     ans += getArea(a[1], a[2], a[3]);
  88.     double r4 = getFourth(a[1], a[2], a[3]);
  89.     double dif = a[0] - r4;
  90.     if (dif < 0) dif = -dif;
  91.     if (dif > 1e-8) puts("-1"); else {
  92.       printf("%.17lf\n", ans);
  93.     }
  94.   }
  95. }
Advertisement
Add Comment
Please, Sign In to add comment