标签:数字 int 所在 mid else 满足 查找 check 函数
又是被迫营业。
这道题目很简单但我错了
二分模板题.
1 int l = -1,r =N; 2 while(l+1!=r) 3 { 4 m=(l+r)>>1; 5 if(check(m)) l=m; 6 else r=m; 7 } 8 return l or r;
这个模板有几亿个细节值得注意:
1.l 与 r的初值在有效区间外,为了防止整个区间都满足或都不满足 check 函数
2.L = m,r = m。这里经常有人写成l=m+1或r=m-1 但这里为了不会产生边界问题与容易记忆就写成L=m,r=m。
3.l 表示check函数满足的边界,如都不满足check函数就为-1,r表示不满足check函数的边界,如都满足check函数就为n。
程序:
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,m,a[1000000+10]={0}; 4 int main() 5 { 6 scanf("%d%d",&n,&m); 7 for(int i=1;i<=n;i++) 8 { 9 scanf("%d",&a[i]); 10 } 11 while(m--) 12 { 13 int k; 14 scanf("%d",&k); 15 int r=n+1,l=0; 16 while(l+1!=r) 17 { 18 int mid=(l+r)/2; 19 if(a[mid]>=k) 20 { 21 r=mid; 22 } 23 else if(a[mid]<k) 24 { 25 l=mid; 26 } 27 } 28 if(a[r]==k) printf("%d\n",r-1); 29 else printf("%d\n",-1); 30 } 31 return 0; 32 }
标签:数字,int,所在,mid,else,满足,查找,check,函数 来源: https://www.cnblogs.com/wjk53233/p/16183832.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。