最近比赛很多题目都用到了二分,主要考察的就是二分查找求上下界。二分很方便,也很常用,学好二分很有必要。
二分的思想就不赘述,相信每个人明白,值得注意的就是二分查找求上下界。
二分查找:
int pow(int *a,int n,int t)//二分查找
{
int low = 0, high = n;
while(low < high)
{
int mid = low + (high - low)/2;
if(a[mid] == t) return mid;
else if(a[mid] > t) high = mid;
else low = mid + 1;
}
return -1;
}
二分查找求上界:
int upper_bound(int *a,int n,int t)//二分查找求上界
{
int low = 0, high = n;
while(low < high)
{
int mid = low + (high - low)/2;
if(a[mid] <= t) low = mid + 1;
else high = mid;
}
return high;
}
练习:http://acm.nyist.net/JudgeOnline/problem.php?pid=776二分查找求下界:
int lower_bound(int *a,int n,int t)//二分查找求下界
{
int low = 0, high = n;
while(low < high)
{
int mid = low + (high - low)/2;
if(a[mid] >= t) high = mid;
else low = mid + 1;
}
return low;
}
练习:http://acm.nyist.net/JudgeOnline/problem.php?pid=904