2024年蓝桥杯小白赛 矿石样本分析【算法赛】 题型:双指针

61 阅读1分钟

www.lanqiao.cn/problems/18…

思想

首先我判断一下如果是b[l]*2==k,那么说明对于b[l]来说,b[r]此刻必须和b[m]一样,此时b[l]+b[r]才能等于k。但是此时b[l]就不满足条件了。因为题目说了只有两个属性不同的钻石相加和为k,才是合法的情况。

#include <iostream>
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+10;
int a[N];
int n,k;
set<int> s;
int ans=-1;
signed main()
{
  

  cin>>n>>k;

  for(int i=1;i<=n;i++)cin>>a[i];


  int l=1,r=n;
  while(l<=r)
  {
       s.insert(a[l]),s.insert(a[r]);  //如果b[l]和b[r]]不相等,且b[r]存在  那么b[l]就是合法情况,l就是合法坐标,l也就是合法找到宝石的时间
       if(a[l]*2!=k&&s.count(k-a[l]))ans=l;   //如果b[r]和b[l]]不相等,且b[l]存在
      if(a[r]*2!=k&&s.count(k-a[r]))ans=l; 
     if(ans>0)break;
++l,--r;  //否则就找下一个
    
  }

  cout<<ans;
  return 0;
}

image.png