來自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\n",s); 53 54 55 56 57 58 return 0; 59 }