HDU 1798 Tell me the area
HDU 1798 Tell me the area .Tell me the areaTime Limit: 3000/1000 MS (Java/Others)????Memory Limit:
HDU 1798 Tell me the area .
Tell me the area
Time Limit: 3000/1000 MS (Java/Others)????Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 900????Accepted Submission(s): 284
42905042011-07-29 21:40:46Accepted179862MS208K1115 BC++#include <iostream>#include <cmath>using namespace std;#define fp(x) ((x) * (x))#define fmin(x, y) ((x) < (y)? (x): (y))int main(){ double x1, y1, r1, x2, y2, r2; double A, B, C, d, d0, d1, d2, ang1, ang2, taa1, taa2, ara1, ara2, area; while (scanf("%lf%lf%lf%lf%lf%lf", &x1, &y1, &r1, &x2, &y2, &r2) != EOF) { if (r1 > r2) //保证圆A半径小于圆B { swap(r1, r2); swap(x1, x2); swap(y1, y2); } A = 2 * (x2 - x1); B = 2 * (y2 - y1); C = fp(x1) - fp(x2) + fp(y1) - fp(y2) + fp(r2) - fp(r1); d = sqrt(fp(A) + fp(B)); d0 = sqrt(fp(x1 - x2) + fp(y1 - y2)); d1 = abs(A * x1 + B * y1 + C) / d; d2 = abs(A * x2 + B * y2 + C) / d; if (d0 >= r1 + r2) area = 0.0; else if (d0 + r1 <= r2) area = acos(-1.0) * fp(r1); else { ang1 = acos(d1 / r1); ang2 = acos(d2 / r2); taa1 = r1 * d1 * sin(ang1); taa2 = r2 * d2 * sin(ang2); ara1 = ang1 * fp(r1); ara2 = ang2 * fp(r2); area = ara2 - taa2; if (d0 >= d2) area += ara1 - taa1; else area += acos(-1.0) * fp(r1) - ara1 + taa1;; } printf("%.3lf\n", area); } return 0;}
?注意DB错误……a - (c + d) = a - c + d