来自BNU热身赛的一道几何题,个人感觉还行,毕竟Q神卡了7次才过去。。
E. School Flower
Time Limit: 1000ms
Memory Limit: 65536KB
64-bit integer IO format: %lld Java class name: Main学校的草坪上最近种满了漂亮的鲜花,为了给这些花朵浇水,学校购置了两个用于灌溉的喷头。每个喷头都有一个喷射半径,可以给喷射半径内的植物浇水。草坪上的有些花恰只能被一个喷头灌溉;可能还些花会被两个喷头同时灌溉,这些花会生长的更旺盛。
现在,ch0588想请你帮忙计算下,能同时被两个喷头灌溉的面积有多大?(下图中红色面积为所求)
(上图红色部分为所求面积)
Input
输入数据只有两行实数,用空格隔开
x1 y1 r1
x2 y2 r2
分别代表两个第i个喷头的位置(xi,yi),和它的喷射半径ri。
(0<xi,yi,ri<1000.0)
Output
输出一行,题目描述中的所求面积(保留两位小数)
Sample Input
1.0 3.0 3.0 1.0 8.0 4.0
Sample Output
6.64
Hint
π的值请取:3.1415926
解题思路:
思路上没有什么难的,主要是讨论两个圆的各种位置关系,然后得到我们需要的结果。。。
相离和包含可以直接写,但是相交的话,要手推公式了。
代码:
1 # include<cstdio> 2 # include<iostream> 3 # include<set> 4 # include<cmath> 5 # include<iomanip> 6 7 using namespace std; 8 9 # define PI 3.1415926 10 11 int main(void) 12 { 13 double x1,y1,r1; 14 double x2,y2,r2; 15 cin>>x1>>y1>>r1; 16 cin>>x2>>y2>>r2; 17 18 double s; 19 double r_ans = fabs(r2-r1); 20 21 double d = sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)); 22 if ( d >= r1+r2 ) 23 {//相离 24 s = 0.00; 25 } 26 else if ( d <= r_ans ) 27 {//内含 28 if ( r2 >= r1 ) 29 { 30 s = PI*r1*r1; 31 } 32 else 33 { 34 s = PI*r2*r2; 35 } 36 } 37 else 38 {//相交 39 double a,aa; 40 double b,bb; 41 a = (r1*r1+(x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)-r2*r2)/(2*r1*d); 42 aa = 2*acos(a); 43 b = (r2*r2+(x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)-r1*r1)/(2*r2*d); 44 bb = 2*acos(b); 45 double s1 = r1*r1*sin(aa)/2; 46 double s2 = r2*r2*sin(bb)/2; 47 double s3 = r1*r1*aa/2; 48 double s4 = r2*r2*bb/2; 49 s = s3-s1+s4-s2; 50 51 } 52 printf("%.2f ",s); 53 54 55 56 57 58 return 0; 59 }