二分法只適用與線性函式,當函式脫離線性而呈現凸性或者凹性的時候,三分是很有必要的。
三分過程如下圖:
凸函式:
凹函式:
實現方法:
double calc(double例題:hdu4355 ( party all the time )p) double solve(double min, double
max)
return
mid_area;
}
#include #includepoj 3301#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;
}
方法,對座標系進行(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的值。四...