圓形路徑上,求某兩點的最大的距離。

2021-08-07 22:44:03 字數 1280 閱讀 6717

搜狗2018筆試題,程式設計題是這樣:乙個環形區域,從小到大輸入每個環形點上的角度,求其中距離最大的兩個點。

寫了半天,人家說最好用時間複雜度低的寫,所以想用時間複雜度為n的方法,但是沒寫出來,邊界不好控制,一直到交完卷了才寫出來,測試了幾個特殊的例子,感覺好像沒問題。。。

輸入資料,第乙個為輸入的資料個數,接下來,從小到大輸入資料,求其中距離最大的兩個點。因為是圓環狀,所以可以用n的平法的方法,也可以稍微改進,用n*log2n的方法。我用的是n的方法,大體思路是:因為有序輸入資料,所以,找到最小的資料很方便,然後以最小的資料點穿過圓心畫直徑,這是第一條線,將所有的資料對映到這條線上,最接近最小資料+180的點,為最終點,算出第乙個最大值。然後以這條直徑作垂直線,同時遍歷一遍資料,找到對映到新直線上的兩個最遠點,這是第二個最終點,求出兩個最終點的最大值,即為最遠點。

用數字舉個例子,比如輸入資料,10.0000,  189.00000,  196.00000,  200.0000  則作第一條直線為,10 ----- 190 ,最遠的兩個點為10.0000   和  189.0000,然後作第二條直線,100 ----- 280,求出最遠點,再算他們之間的最大值。這種方法,只需要遍歷兩遍陣列,時間複雜度為n。個人覺得這個思路沒問題,歡迎挑毛病。(本來筆試的時候,不應該用這麼難受的方法的,其實用n*log2n 就行,哎,當時死心眼了,非得用這個,把自己寫的很難受。。。。)

**:

#include #include #include using namespace std;

void fun(vector&ve,int n)

for(int i = 0; i < n; ++i)

double end = max - min > 180 ? 180 - (max - min - 180) : max - min;

if(flag)

xbegin = xbegin + 90;

xend = xend + 90;

min = xend;

max = xbegin;

for(int i = 0; i < n; ++i)

double tmp = max - min > 180 ? 180 - (max - min - 180) : max - min;

end = end > tmp ? end : tmp;

coutint n;

cin>>n;

double tmp;

for(int i = 0; i < n; ++i)

fun(ve,n);

return 0;

}

求兩點間的距離

煙台大學計算機學院 檔名稱 asdasd.cpp 作 者 劉磊 完成日期 2016年5月20日 版 本 號 vc 6.0 問題描述 分別利用成員函式,友元函式和一般函式求兩點的的距離,並設計main 函式完成測試 程式輸入 無 程式輸出 兩點間的距離 include include using na...

用類求兩點間的距離

設計乙個用來表示直角座標系的location類,在主程式中建立類location的兩個物件a和b,要求a的座標點在第3象限,b的座標點在第2象限,分別採用成員函式和友元函式計算給定兩個座標點之間的距離,要求按如下格式輸出結果 a x1,y1 b x2,y2 distance1 d1 distance...

兩點間的距離

設計乙個名為 mypoint 的類,表示乙個帶jc 座標和少座標的點。該類包括 編寫乙個測試程式,建立兩個點 0,0 和 10,30.5 並顯示它們之間的距離。如下 public class mypoint mypoint double x,double y public double getx p...