2 条题解

  • 0
    @ 2023-6-27 10:31:44

    不用二分,只需要用一个数组 tit_i 表示 ii 是否在第 11 组数据中出现过,然后再输入第二组数据时判断每个数是否在第 11 组数据中出现过就行了。

    #include <bits/stdc++.h>
    using namespace std;
    int n,m,x;
    map<int,bool> t;//因为数据太大,所以把数组换成map。
    vector<int> ans;
    int main(){
        cin>>n>>m;
        while (n--){
            cin>>x;
            t[x]=1;//标记x出现过
        }
        while (m--){
            cin>>x;
            if (t[x]){//如果出现过
                ans.push_back(x);//加入答案
            }
        }
        sort(ans.begin(),ans.end());//排序后输出
        for (int i=0;i<ans.size();i++){
            cout<<ans[i]<<" ";
        }
        return 0;
    }
    
    • 0
      @ 2022-10-19 21:28:11

      经典分二分查找类型的题目,很多都是查找一个数,本题是查找一组数,但思路完全一致。

      #include<bits/stdc++.h>
      using namespace std;
      int n;
      int a[100005], b[100005];
      int find_x(int x)
      {
          int l=1,r=n,mid;
          while(l<=r)
          {
              mid= (r+l)/2;
              if(x==a[mid]) return mid;
              else if(x<a[mid]) r=mid-1;
              else  l=mid+1;
          }
          return -1;
      }
      int main()
      {
          int i,m;
          cin>>n>>m;
          for(i=1;i<=n;i++)
              cin>>a[i];
          for(i=1;i<=m;i++)
              cin>>b[i];  
          sort(a+1,a+n+1);
          sort(b+1,b+m+1);
          for(i=1;i<=m;i++)  //查找m个数 
          {
              if(find_x(b[i])!=-1)
              {
                  cout<<b[i]<<" ";
              }
          }
      }
      
      • 1

      信息

      ID
      894
      时间
      1000ms
      内存
      128MiB
      难度
      5
      标签
      递交数
      133
      已通过
      50
      上传者