NEFU709 第K個圓的半徑

2021-06-16 22:17:25 字數 1596 閱讀 1665

題目:the kth circle

題意:平面上給定n個點的座標,我們可以選其中

3點構成乙個圓,當然也就有

3段弧,我們定義第

k個圓滿足條件:

(1)除了已選的3

個點,剩下的

n-3個點中有

k個點在圓內,有

n-k-1

個點在圓外

(2)保證所有的點在圓的三條弧中其中一條弧的一側

解析:本題實際上就是得到這樣乙個結論,滿足條件的圓其中有兩點一定在這些點的凸包上,並且這兩點相鄰,這樣我們就可以先

求凸包,然後列舉凸包的每條邊,設邊的端點為a,b

,再列舉點

b,然後我們把角

apb按照從小到大的順序排序,其中第

k+1個就

是我們要求的,對於列舉凸包的每一條邊都求出第

k+1個點與凸包邊的端點形成的圓的半徑,記錄最小的。

由於點的數目2000

,比較大,直接列舉會超時。所以採用堆優化。

#include #include #include #include using namespace std;

const int n=2005;

struct point

;struct heap

;heap heap[n];//小頂堆

point p[n];

int stack[n];

bool readin(int &n,int &k)

int cross(point a,point b,point c)

bool cmp(const point &a,const point &b)

double dist(point a,point b)

double getang(const point &a,const point &b,const point &c)

/**根據角a和b對點排序*/

bool heapcmp(const heap &a,const heap &b)

void insert(const heap &a,int &cnt)

else break; }}

void heapdown(const int &id,const int &cnt)

return;

}/**已知三點求三角形的面積*/

double ********area(const point &a,const point &b,const point &c)

/**已知圓上三點求圓半徑*/

double getradius(const point &a,const point &b,const point &c)

void solve(const int &n,const int &k)

stack[++top]=stack[1];

double ans=1000000000;

heap tmp;

for(int i=1;itmp? tmp:ans;

} printf("%.2lf\n",ans);

}int main()

return 0;

}

第K個最大的數

思路一 暴力破解,無序陣列排序,排完序之後找到第k個最大的數,排序方法有多種,但是無序陣列排序快排時間複雜度比較低是o nlogn 思路二 快速選擇 快速選擇是在快速排序的基礎上進行的優化,快速選擇是把找到的基準點與要找的第k個數的下標做比較,如果正好是第k個最大的數直接返回即可,如果是比基準點大則...

Qt 根據圓上的兩個點和半徑獲取圓心

define maxcom f a,b a b 0.00001 true falseqvectoreicwidget getellipsecoors const qpointf r1,const qpointf r2,float r else qvectorrectf rectf已知兩點和半徑計算的...

找到第k個最大的數

一 問題描述 給定乙個陣列,陣列中的資料無序,在乙個陣列中找出其第k個最小的數,例如對於陣列x,x 則其第2個最小的數為2。二 解題思路 本演算法跟快排的思想相似,首先在陣列中選取乙個數centre作為樞紐,將比centre小的數,放到centre的前面將比centre大的數,放到centre的後面...