找数

 

 这道题目是经典二分只是二分中对于mid的判断变了,可以直接套模板。

 

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 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=1e6;
 4 int n,m,a[N]={0};
 5 int main()
 6 {
 7     cin>>n>>m;
 8     for(int i=1;i<=n;i++) scanf("%d",&a[i]);
 9     while(m--)
10     {
11         int k;
12         scanf("%d",&k);
13         int r=n,l=1;
14         while(l+1!=r)
15         {
16             int mid=(l+r)/2;
17             if(a[mid]<=k) l=mid;
18             else r=mid;
19         }
20         if(a[l]==k) printf("%d\n",l);
21         else if(a[r]==k) printf("%d\n",r);
22         else printf("0\n");
23     }
24     return 0;
25 }

 

posted @ 2022-05-01 17:57  王浩泽  阅读(98)  评论(0)    收藏  举报