三分模板

三分模板

三分整數模板

凸函數的極大值

ll l, r;
while(l < r) {
    ll lmid = l + (r - l) / 3;
    ll rmid = r - (r - l) / 3;
    if(calc(lmid) <= calc(rmid))	l = lmid + 1;
    else r = rmid - 1;
}
printf("%lld\n", max(calc(l), calc(r)));

凹函數的極小值

ll l, r;
while(l < r) {
    ll lmid = l + (r - l) / 3;
    ll rmid = r - (r - l) / 3;
    if(calc(rmid) >= calc(lmid))	r = mid - 1;
    else 	l = mid + 1;
}
printf("%lld\n", min(calc(l), calc(r)));

三分小數模板

凸函數的極大值

double l, r;
for(int i = 0; i < 300; i++) {
    double lmid = l + (r - l) / 3;
    double rmid = r - (r - l) / 3;
    if(calc(lmid) <= calc(rmid))	l = lmid;
    else 	r = rmid;
}
printf("%.6f\n", calc(l));

凹函數的極小值

double l, r;
for(int i = 0; i < 300; i++) {
    double lmid = l + (r - l) / 3;
    double rmid = r - (r - l) / 3;
    if(calc(rmid) >= calc(lmid))	r = rmid;
    else 	l = lmid;
}
printf("%.6f\n", calc(l));
相關文章
相關標籤/搜索