uvalive 4986 三分查詢

2021-12-29 22:32:42 字數 1141 閱讀 1524

題意:空間內有n個點,求乙個最小體積的圓錐把所有點包進去。輸出圓錐的高和底面半徑。圓錐的底面圓心在(0,0),所有點的z座標都大於等於0。

題解:因為圓錐體積是 v = 1/3 * π * r^2 * h ,這是乙個二次函式,也就是個凸性函式,可以用三分查詢的方式列舉兩個高,然後找到對應的最小的r,比對兩個高得到的體積繼續三分查詢。

#include

#include

#include

#include

using namespace std;

const double pi = acos(-1);

const double eps = 1e-9;

struct point

};typedef point vector;

double dcmp(double x)

vector operator + (const point& a, const point& b)

vector operator - (const point& a, const point& b)

vector operator * (const point& a, double a)

vector operator / (const point& a, double a)

double cross(const vector& a, const vector& b)

double dot(const vector& a, const vector& b)

double length(const vector& a)

bool operator < (const point& a, const point& b)

bool operator == (const point& a, const point& b)

const int n = 10005;

point p[n], hp[n];

int n;

double solve(double h)

int main()

while (dcmp(r - l) > 0)

printf(%.3lf %.3lf

, l, solve(l));

}return 0;

}

三分查詢總結

演算法背景 二分與三分類似。二分法利用的是函式的單調性。而三分法利用的是函式的單峰性。二次函式就是乙個典型的單峰函式。三分法與二分法一樣,它會不斷縮小答案所在的求解區間,直到求出極值。如圖 演算法流程 1 設當前求解的區間為 l,r 令 m1 l r l 3,m2 r r l 3 2 接著我們計算這...

三分查詢演算法

輸入 n個元素的公升序陣列 a 1 n 和元素x 輸出 如果x a j 1 j n,則輸出就,否則輸出 0.步驟 1 先把整個區間的 n 3的值 lmid n 3 left。2 再取右側區間的中間值 rmid lmid right,從而把區間分為三個小區間。3 我們a lmid 的值與 x進行比較,...

二分查詢,三分查詢

今天看分治法那塊,裡面提到了二分搜尋,想想好多年沒寫這個簡單的程式了,話說當年第乙個真正意義上理解的是三分查詢,即二分搜尋的拓展,所以根據分治法的思想,重新寫了二分搜尋,三分搜尋這兩個程式,突然回憶起來,當初對m l r 2,竟一點沒有懷疑過,那些分割點是怎麼求出來的,要提醒像我一樣初寫程式的朋友,...