您的位置:首页 > 其它

二分和三分模板

2013-10-19 15:35 387 查看
注意一点,double的循环条件中最好使用以下的表示(L + EPS < R),如果使用dcmp(R - L)> 0判断也可以,但是使用dcmp函数时候一定不能写等号,因为如果两个double数在EPS范围内相等的还继续的话会导致死循环

二分:

(递增)

double calc(double n)
{
return ;
}

double solve(double L, double R, double v)
{
double M;
while (L + EPS < R)
{
M = (L + R) / 2;
if (calc(M) > v)
R = M;
else
L = M;
}
return R;
}


(递减)

double calc(double n)
{
return ;
}

double solve(double L, double R, double v)
{
double M;
while (L + EPS < R)
{
M = (L + R) / 2;
if (calc(M) < v)
R = M;
else
L = M;
}
return R;
}


三分:

const double EPS = 1e-10;

double calc(double n)
{
return;
}

double solve(double L, double R)
{
double M, RM;
while (L + EPS < R)
{
M = (L + R) / 2;
RM = (M + R) / 2;
if (calc(M) < calc(RM)) //计算最小值
R = RM;
else
L = M;
}
return L;
}


int的三分:

网上没有现成的,只能自己写一个。。。

计算最小值的三分:

int calc(int n)
{
return ;
}
int solve(int L, int R)
{
int M, RM, VM, VRM;
while (L + 1 < R)
{
M = (L + R) / 2;
RM = (M + R) / 2;
VM = calc(M); VRM = calc(RM);
if (VM < VRM)
R = RM;
else if (VM > VRM)
L = M;
else
break;
}
M = (L + R) / 2;
int vl = calc(L), vm = calc(M), vr = calc(R);
if (vl <= vm && vl <= vr) return L;
else if (vm <= vl && vm <= vr) return M;
return R;
}

计算最大值的三分:

int calc(int n)
{
return;
}
int solve(int L, int R)
{
int M, RM, VM, VRM;
while (L + 1 < R)
{
M = (L + R) / 2;
RM = (M + R) / 2;
VM = calc(M); VRM = calc(RM);
if (VM > VRM) //计算最小值
R = RM;
else if (VM < VRM)
L = M;
else
break;
}
M = (L + R) / 2;
int vl = calc(L), vm = calc(M), vr = calc(R);
if (vl >= vm && vl >= vr) return L;
else if (vm >= vl && vm >= vr) return M;
return R;
}


二分还是stl的简单,还是贴上自己的代码,以备后用

int的二分(闭区间):

//YES_LEFT, NO_RIGHT
int bSearch(int l, int r, int v)
{
int m;
while (l <= r)
{
m = (l + r) >> 1;
if (n[m] < v)
l = m + 1;
else
r = m - 1;
}
return l;
}


//YES_RIGHT, NO_LEFT
int bSearch(int l, int r, int v)
{
int m;
while (l <= r)
{
m = (l + r) >> 1;
if (n[m] <= v)
l = m + 1;
else
r = m - 1;
}
return r;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  acm 模板 二分 三分