二分模版练习

二分初学者一定要认真熟练将以下模版练习并将逻辑理解清楚

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int a[10]={1,3,5,7,9,9,9,11,13,15};
 4 //二分查找1  返回>=p的第一数下标,相当于jlower_bound() 
 5 int bs1(int p){ 
 6     int l=0, r=10-1;
 7     int ans=-1;
 8     while(l<=r){
 9         int mid=(l+r)/2;
10         if(a[mid]>=p){
11             ans=mid;
12             r=mid-1;
13         }
14         else
15             l=mid+1;
16     }
17     return ans;//返回值为-1表示数列中所有数都<P
18 }
19 //二分查找2  返回>p的第一数下标,相当于upper_bound()
20 int bs2(int p){ 
21     int l=0, r=10-1;
22     int ans=-1;
23     while(l<=r){
24         int mid=(l+r)/2;
25         if(a[mid]>p){
26             ans=mid;
27             r=mid-1;
28         }
29         else
30             l=mid+1;
31     }
32     return ans;//返回值为-1表示数列中所有数都<P
33 }
34 //二分查找3  返回<p的最大数值下标
35 int bs3(int p){ 
36     int l=0, r=10-1;
37     int ans=-1;
38     while(l<=r){
39         int mid=(l+r)/2;
40         if(a[mid]<p){
41             ans=mid;
42             l=mid+1;
43         }
44         else
45             r=mid-1;
46     }
47     return ans;//返回值为-1表示数列中所有数都>P
48 }
49 //二分查找4  返回<=p的最大数值下标
50 int bs4(int p){ 
51     int l=0, r=10-1;
52     int ans=-1;
53     while(l<=r){
54         int mid=(l+r)/2;
55         if(a[mid]<=p){
56             ans=mid;
57             l=mid+1;
58         }
59         else
60             r=mid-1;
61     }
62     return ans;//返回值为-1表示数列中所有数都>P
63 }
64 int main()
65 {
66     
67     while(1){//供测试函数使用 
68         int x;
69         cin>>x;
70         cout<<bs4(x)<<endl;
71     }
72     
73     return 0;
74 }

猜你喜欢

转载自www.cnblogs.com/tflsnoi/p/13206085.html