1. 程式人生 > >最長線段(幾何證明題)

最長線段(幾何證明題)

最長線段(chord.pas/chord.in/chord.out)

(LYOI資訊學綜合模擬20090321Problem 1)
問題描述
給定兩個圓各自的圓心座標和半徑長。過其中一個交點作直線,該直線與圓的另外兩個交點分別為A、B。線段AB最長是多少?
輸入資料
第一行有三個用空格隔開的整數x1,y1,r1,依次表示第一個圓的圓心座標和半徑;
第二行有三個用空格隔開的整數x2,y2,r2,依次表示第二個圓的圓心座標和半徑;
輸入資料保證兩圓相交。
輸出資料
輸出AB的最大長度。你的輸出需要保留6位小數。
輸入樣例
5 4 4
-3 2 5
輸出樣例
16.492423
資料規模
對於30%的資料,x1=y1;
對於50%的資料,r1=r2;
對於100%的資料,輸入資料在integer範圍內。
思路
這個題其實我是靠直覺做的,然後它的輔助證明類似於JSQ大佬的方法,我自己造了幾組圓然後算了算,發現是當這條線段垂直於兩交點連線時最短,然後利用一組相似三角形即可求出解的比值大概是2:1,所以就是圓心距的2倍。

正解思路是用幾何證明證明出這個答案是對的。
這裡寫圖片描述
求證:經過相交兩圓的一個交點的那些直線,被兩圓所截得的線段中,平行於連心線的那一條線段最長。
分析:如圖,PQ∥OO′,要證明PQ最長,只須證明PQ大於過A點的任意一條不平行於OO′的割線P′Q′,這是證明與圓的弦有關的問題,因此過O、O′分別作PQ、P′Q′的垂線,垂足分別為C、D;C′、D′。由垂徑定理知AC= AP、AD= AQ,所以CD= PQ。同理C′D′= P′Q′,又OO′=CD,於是問題轉化為證明OO′> C′D′,而OO′D′C′為直角梯形,顯然有OO′> C′D′。從而問題可證。

然後放上比較簡單的程式碼。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cmath>
using namespace std;
double x1,x2,y,y2,r1,r2;
int main()
{
    freopen("chord.in","r",stdin);
    freopen("chord.out","w",stdout);
    scanf("%lf%lf%lf",&x1,&y,&r1);
    scanf
("%lf%lf%lf",&x2,&y2,&r2); printf("%.6lf",2*sqrt((x1-x2)*(x1-x2)+(y-y2)*(y-y2))); return 0; } /* 5 4 4 -3 2 5 */

妹子圖以後再補上。。。
這裡寫圖片描述