7 条题解

  • 13
    @ 2022-12-7 17:55:44
    #include <bits/stdc++.h>
    using namespace std;
    int ans,l,r,q,n,x,a[100005];
    int main()
    {
       cin >> n;
       for (int i = 1;i <= n;i ++)
          cin >> a[i];
       cin >> q;
       for (int i = 1;i <= q;i ++)
       {
          cin >> x;
          ans = -1;//注意这里一定是-1!!!千万不要学下面那位 "c++大佬"!
          l = 1;
          r = n;
          while (l <= r)
          {
             int mid = (l + r) / 2;
             if (a[mid] <= x)
             {
                   if (a[mid] == x)
                   {
                      ans = mid;
                   }
                   l = mid + 1;
             }
             else
                   r = mid - 1;
          }
          cout << ans << " ";
       }
       return 0;
    }//已AC,请放心食用
    
    • 2
      @ 2022-8-21 15:41:47

      这道题与左侧边界的思路一样,在上一题的基础上再修改一些判断条件以及代码即可

      for (int i=1;i<=q;i++)
      {
          cin>>x;
          ans=-1;
          l=1;
          r=n;
          while (l<=r)
          {
              int mid=(l+r)/2;
              if (a[mid]<=x)
              {
                  if (a[mid]==x)//无法确定是否为x,需再判断一次
                  {
                      ans=mid;
                  }
                  l=mid+1;
              }
              else
              {
                  r=mid-1;
              }
          }
          cout<<ans<<" ";
      }
      
      • 0
        @ 2023-7-1 14:08:18
        #include <iostream>
        #include <algorithm>
        using namespace std;
        int a[100001],n,q,x;
        int main()
        {
            cin>>n;
            for (int i=1;i<=n;i++)
                cin>>a[i];
            cin>>q;
            for (int i=1;i<=q;i++)
            {
                cin>>x;
                if (a[upper_bound(a+1,a+n+1,x)-a-1]==x)
                    cout<<upper_bound(a+1,a+n+1,x)-a-1<<' ';
                else
                    cout<<-1<<' ';
            }
        }
        
        • 0
          @ 2023-6-27 10:12:07
          #include <bits/stdc++.h>
          using namespace std;
          int n,q,x;
          int a[100005];
          int main(){
              cin>>n;
              for (int i=1;i<=n;i++){
                  cin>>a[i];
              }
              sort(a+1,a+n+1);
              cin>>q;
              while (q--){
                  cin>>x;
                  int l=1,r=n;
                  while (l<=r){
                      int mid=(l+r)>>1;
                      if (a[mid]<=x){//这次交换一下位置,先判断小于等于,找到有边界
                          l=mid+1;
                      }else{
                          r=mid-1;
                      }
                  }
                  cout<<(a[r]==x?r:-1)<<" ";
              }
              return 0;
          }
          
          • 0
            @ 2022-12-20 15:21:26

            首先把上面二分查找左侧边界的答案搬下来:

            #include <bits/stdc++.h>
            using namespace std;
            int l, r, x, a[100001], n, ans, q;
            int main()
            { 
                cin >> n;
                for (int i = 1; i <= n; i++)
                {
                    cin >> a[i];
                }
                cin >> q;
                for (int i = 1; i <= q; i++)
                {
                    cin >> x;
                    ans = -1;
                    l = 1;
                    r = n;
                    while (l <= r)
                    {
                        int mid = (l + r) / 2;
                        if (a[mid] >= x)
                        {
                            if (a[mid] == x)
                            {
                                ans = mid;
                            }
                            r = mid - 1;
                        }
                        else
                        {
                            l = mid + 1;
                        }
                    }
                    cout << ans <<" ";
                }
                return 0;
            }
            

            然后把

            r = mid - 1;
            

            l = mid + 1
            

            的位置交换一下:

            #include <bits/stdc++.h>
            using namespace std;
            int l, r, x, a[100001], n, ans, q;
            int main()
            { 
                cin >> n;
                for (int i = 1; i <= n; i++)
                {
                    cin >> a[i];
                }
                cin >> q;
                for (int i = 1; i <= q; i++)
                {
                    cin >> x;
                    ans = -1;
                    l = 1;
                    r = n;
                    while (l <= r)
                    {
                        int mid = (l + r) / 2;
                        if (a[mid] <= x)
                        {
                            if (a[mid] == x)
                            {
                                ans = mid;
                            }
                            l = mid + 1;
                        }
                        else
                        {
                            r = mid - 1;
                        }
                    }
                    cout << ans <<" ";
                }
                return 0;
            }
            

            再来看一下ChatGPT的解释和注意事项(废话有亿点多):

            这段代码实现了二分查找的功能。
            
            它首先输入了一个整数 n,然后输入了 n 个数存储在数组 a 中。接着输入了另一个整数 q,表示要进行的查询次数。接下来,对于每一次查询,它会输入一个数 x,并在数组 a 中查找是否有数与 x 相等。
            
            为了实现二分查找,它使用了一个循环来进行多次查询。在每次查询中,它首先将查询范围的左端点设为 l,右端点设为 r,然后不断地更新这两个变量,直到找到等于 x 的数或者查询范围为空。
            
            具体地,每次循环中,它都会计算出查询范围的中点 mid,然后比较 a[mid] 与 x 的大小关系。如果 a[mid] 小于等于 x,那么它就更新左端点 l 为 mid+1,继续查找。如果 a[mid] 大于 x,那么它就更新右端点 r 为 mid-1,继续查找。如果在某次查找中发现 a[mid] 等于 x,那么它就将答案设为 mid,并继续查找。
            
            当循环结束时,如果答案仍然是 -1,说明数组中不存在数与 x 相等;如果答案不是 -1,说明数组中存在数与 x 相等,且答案为这个数在数组中的下标。最后,它会将答案输出到控制台。
            
            代码中包含了两个头文件:
            
            #include <bits/stdc++.h>:这个头文件包含了许多常用的 C++ 标准库头文件,包括 iostream、string、algorithm 等。
            
            using namespace std;:这句话告诉编译器使用标准 C++ 库中的命名空间 std。
            
            代码中定义了四个变量:
            
            l、r:表示查询范围的左端点和右端点。
            
            x:表示当前查询的数。
            
            a:表示存储了 n 个数的数组。
            
            ans:表示查询结果,如果查找到数与 x 相等,则为这个数在数组中的下标;否则为 -1。
            
            代码中包含了两个循环:
            
            外层循环:用于控制进行的查询次数。
            
            内层循环:用于控制查找的过程,每次查找都会更新查询范围的左右端点。
            
            最后,代码中的 return 0; 表示程序执行结束,并返回 0。
            
            代码中的几个函数和操作值得注意:
            
            cin 和 cout:分别表示输入和输出流,用于读入和输出数据。
            
            >> 和 <<:分别表示流提取和流插入运算符,用于从输入流读入数据或者向输出流输出数据。
            
            while 循环:当某个条件为真时,不断执行循环体中的语句。
            
            / 运算符:表示除法运算,用于计算查询范围的中点。
            
            if 语句:如果某个条件为真,则执行语句块中的语句;否则执行其他语句。
            
            希望这些解释能够帮助你理解代码的意义。如果你对二分查找或者 C++ 中的其他知识点有疑问,欢迎继续提问。
            
            • -6
              @ 2022-4-24 16:09:44

              鼓励大家写题解,但注意题解格式。

              给代码两端加上这个会舒服一些

              ```cpp

              你的代码

              ```

              </span>

              这个点在键盘的左上角tab上面那个键,注意切换输入法

              #include<iostream>
              using namespace std;
              int main()
              {
                  int n;
                  cin>>n;//这是一个注释
                  return 0;
              } 
              

              请注意严禁抄袭题解,写题解不要只放代码,需加上你的思路或代码注释。

              抄袭题解一经发现直接取消成绩。

              • -11
                @ 2022-11-27 14:26:07

                嗨嗨,来喽 这道题很简单,只需要用二分查找即可解决问题啦

                AC代码,放心使用

                #include <bits/stdc++.h>
                using namespace std;
                int ans,l,r,q,n,x,a[100005];
                int main()
                {
                   cin >> n;
                   for (int i = 1;i <= n;i ++)
                      cin >> a[i];
                   cin >> q;
                   for (int i = 1;i <= q;i ++)
                   {
                      cin >> x;
                      ans = -100000;//大小无所谓,小于0就行
                      l = 1;
                      r = n;
                      while (l <= r)
                      {
                         int mid = (l + r) / 2;
                         if (a[mid] <= x)
                         {
                               if (a[mid] == x)
                               {
                                  ans = mid;
                               }
                               l = mid + 1;
                         }
                         else
                               r = mid - 1;
                      }
                      cout << ans << " ";
                   }
                   return 0;
                }
                

                喂喂,别走啊,点个赞呗~

                • @ 2022-12-1 17:38:45

                  你确定这是AC??

                • @ 2022-12-20 15:15:16

                  评测结果:啊对对对,就AC两个

                • @ 2023-6-27 10:13:54

                  管理员,把这篇题解撤了!

                  才AC两个点,睬他

                • @ 2023-6-27 19:03:33
                  if (a[mid] <= x)
                  
                • @ 2023-8-2 19:35:15

                  就AC俩 😕 还点赞 电脑:差评成功👎 请看AC代码(已实验):

                  #include <bits/stdc++.h>
                  using namespace std;
                  int l, r, x, a[100001], n, ans, q;
                  int main()
                  { 
                      cin >> n;
                      for (int i = 1; i <= n; i++)
                      {
                          cin >> a[i];
                      }
                      cin >> q;
                      for (int i = 1; i <= q; i++)
                      {
                          cin >> x;
                          ans = -1;
                          l = 1;
                          r = n;
                          while (l <= r)
                          {
                              int mid = (l + r) / 2;
                              if (a[mid] <= x)
                              {
                                  if (a[mid] == x)
                                  {
                                      ans = mid;
                                  }
                                  l = mid + 1;
                              }
                              else
                              {
                                  r = mid - 1;
                              }
                          }
                          cout << ans <<" ";
                      }
                      return 0;
                  }
                  
                • @ 2024-1-23 9:54:29

                  (´・ω・`)

                • @ 2024-1-23 9:54:51

                  (´・ω・`)

                • @ 2024-5-12 11:17:49

                  《小于0就行》

                • @ 2024-5-12 17:25:39

                  @ 就AC俩😕还点赞?电脑:差评成功👎请看AC代码(已实验):

                  #include<bits/stdc++.h>
                  using namespace std;
                  int main(){
                  int a[100000],b,c,d,e;cin>>b;
                  for(e=1;e<=b;e++)cin>>a[e];
                  cin>>c;
                  for(e=1;e<=c;e++){cin>>d;if(a[upper_bound(a+1,a+b+1,d)-a-1]==d){cout<<upper_bound(a+1,a+b+1,d)-a-1<<' ';}else cout<<-1<<' ';}
                  return 0;
                  }
                  
              • 1

              信息

              ID
              891
              时间
              1000ms
              内存
              128MiB
              难度
              3
              标签
              递交数
              754
              已通过
              390
              上传者