題目: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的後面...