三分法解決凸(凹)函式極值問題

2021-09-06 06:38:52 字數 3475 閱讀 1732

二分法只適用與線性函式,當函式脫離線性而呈現凸性或者凹性的時候,三分是很有必要的。

三分過程如下圖:

凸函式:

凹函式:

實現方法:

double calc(double

p) double solve(double min, double

max)

return

mid_area;

}

例題:hdu4355 ( party all the time )

#include #include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define cl(arr, val) memset(arr, (val), sizeof(arr))

#define rep(i, n) for((i) = 0; (i) < (n); ++(i))

#define for(i, l, h) for((i) = (l); (i) <= (h); ++(i))

#define ford(i, h, l) for((i) = (h); (i) >= (l); --(i))

#define l(x) (x) << 1

#define r(x) (x) << 1 | 1

#define mid(l, r) ((l) + (r)) >> 1

#define min(x, y) (x) < (y) ? (x) : (y)

#define max(x, y) (x) < (y) ? (y) : (x)

#define e(x) (1 << (x))

#define iabs(x) ((x) > 0 ? (x) : -(x))typedef

long

long

ll;const

double eps = 1e-6

;const

double inf = 1000000000

;using

namespace

std;

const

int n = 50010

;struct

node q[n];

intn;

double calc(double

p)

return

tmp;

}double solve(double min, double

max)

//printf("%.10f\n", mid_area);

return

mid_area;

}int

main()

double ans = solve(mi, mx) + 0.5

; printf(

"case #%d: %d\n

", ++cas, int

(ans));

}return0;

}

poj 3301

方法,對座標系進行(0, 180]度的旋轉,然後每個點得到新的座標,找到最上面,最下面,最左面和最右面的點,然後就行確定當前旋轉角度的面積。

x' = x*cos(th) + y*sin(th);

y' = y*cos(th) - x*sin(th);

//

#pragma comment(linker,"/stack:327680000,327680000")

#include #include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define cl(arr, val) memset(arr, val, sizeof(arr))

#define rep(i, n) for((i) = 0; (i) < (n); ++(i))

#define for(i, l, h) for((i) = (l); (i) <= (h); ++(i))

#define ford(i, h, l) for((i) = (h); (i) >= (l); --(i))

#define l(x) (x) << 1

#define r(x) (x) << 1 | 1

#define mid(l, r) (l + r) >> 1

#define min(x, y) (x) < (y) ? (x) : (y)

#define max(x, y) (x) < (y) ? (y) : (x)

#define e(x) (1 << (x))

#define iabs(x) (x) < 0 ? -(x) : (x)

#define out(x) printf("%i64d\n", x)

#define read() freopen("data.in", "r", stdin)

#define write() freopen("data.out", "w", stdout);typedef

long

long

ll;const

double eps = 1e-8

;const

double pi = acos(-1.0

);const

double inf = ~0u>>2

;using

namespace

std;

const

int n = 50

;struct

node p[n];

intn;

double calc(double

th)

return max((r - l)*(r - l), (u - d)*(u -d));

}double solve(double min, double

max)

return

mid_area;

}int

main()

return0;

}

演算法詳解 三分法求極值

對於二分,相信你一定十分熟悉。就是在乙個具有單調性序列上查詢你所需要的數字。由於其單調性,你每一次在查詢是就可以將規模縮小一半,大致就是 1.假設這個數列單調遞增 2.維護乙個區間左端點l ll,區間右端點r和中間點mid midmi d3.如果mid midmi d比想要的值小,則左邊肯定不可以,...

三分法解決假幣問題(JAVA

一,問題描述 有n個硬幣,其中有一枚是假幣,假幣比真幣要輕,現有一天平,通過比較找出假幣。二,三分法思路 1.將硬幣分為三堆,每堆按照n 3向上取整個硬幣來分配 主要分配前兩堆,第三堆就是剩下的 2.比較第一堆和第二堆硬幣重量 若重量相等,則在第三堆中找假幣,重複第一步 若第一堆比第二堆重,則在假幣...

三分法(洛谷3382 模板 三分法)

如題,給出乙個n次函式,保證在範圍 l,r 內存在一點x,使得 l,x 上單調增,x,r 上單調減。試求出x的值。輸入格式 第一行一次包含乙個正整數n和兩個實數l r,含義如題目描述所示。第二行包含n 1個實數,從高到低依次表示該n次函式各項的係數。輸出格式 輸出為一行,包含乙個實數,即為x的值。四...