标签:names image bit 思路 png 拷贝 main color ace
目前尚没有很彻底的理解,所以先将大佬的模板和思路拷贝下来,待理解透彻后再上自己的理解。
二分模板一共有两个,分别适用于不同情况。
算法思路:假设目标值在闭区间[l, r]中, 每次将区间长度缩小一半,当l = r时,我们就找到了目标值。
版本1
当我们将区间[l, r]划分成[l, mid]和[mid + 1, r]时,其更新操作是r = mid或者l = mid + 1;,计算mid时不需要加1。
C++ 代码模板:
int bsearch_1(int l, int r) { while (l < r) { int mid = l + r >> 1; if (check(mid)) r = mid; else l = mid + 1; } return l; }
版本2
当我们将区间[l, r]划分成[l, mid - 1]和[mid, r]时,其更新操作是r = mid - 1或者l = mid;,此时为了防止死循环,计算mid时需要加1。
C++ 代码模板:
int bsearch_2(int l, int r) { while (l < r) { int mid = l + r + 1 >> 1; if (check(mid)) l = mid; else r = mid - 1; } return l; }
例题:
题解代码:
#include<bits/stdc++.h> using namespace std; const int N = 1e6+10; int a[N]; int n,m; int main(){ scanf("%d%d",&n,&m); for(int i = 0;i < n;i++)scanf("%d",&a[i]); while(m--){ int x; scanf("%d",&x); int l = 0,r = n-1; while(l<r){ int mid = l + r >> 1; if(a[mid] >= x) r = mid; else l = mid + 1; } if(a[l] != x) printf("-1 -1\n"); else{ printf("%d ",l); int l = 0,r = n-1; while(l < r){ int mid = l + r + 1 >> 1; if(a[mid] <= x) l = mid; else r = mid - 1; } printf("%d\n",l); } } return 0; }
标签:names image bit 思路 png 拷贝 main color ace
原文地址:https://www.cnblogs.com/Flydoggie/p/12235385.html