问题的关键在于找到合适的方向,以及《=,《等之间的区别,此外,本方法使用于连续区间中寻找合适答案的模型,需要str,end循环和chack函数辨别是否成立。共两部分。

找到答案的二分查找

图示为找对应答案的最高位置

using gg=long long;
gg chack1(gg str, gg end)
{
gg f = 0;
for (; str <= end;)
{
gg min = (str + end) / 2;
if (a[min]<=c)
{
str = min + 1; f = min;
}
else end = min - 1;
}
if (a[f] != c)return 0;
return f;
}

以下为找对应答案的最低位置

gg chack2(gg str,gg end)
{
gg f = 0;
for (; str <= end;)
{
gg min = (str + end) / 2;
if (a[min]>=c)
{
end = min - 1;
f = min;
}
else str= min+1;
}
if (a[f] != c)return 0;
return f;
}

找最适位置

gg mory(gg str,gg end)
{
for (; str < end-1;)
{
gg min = (str + end) / 2;
if (a[min]>=c)
end = min;
else str= min;
}
if (chack(end))return end;
else return str;
}

其中chack表示对min检查是否正确,适用于找最适而非判别

也可用于小数类型的二分数据。

一般str值为1

若为0,会出现0+0=0,0/2=0,?/0=re的事情