1048 Find Coins (25 分)

这不双指针板子题吗🎈。

const int N=1e5+10;
int a[N];
int n,m;

int main()
{
    cin>>n>>m;

    for(int i=0;i<n;i++) cin>>a[i];
    sort(a,a+n);

    int l=0,r=n-1;
    bool ok=false;
    while(l<r)
    {
        if(a[l]+a[r] > m) r--;
        else if(a[l] + a[r] < m) l++;
        else
        {
            ok=true;
            cout<<a[l]<<' '<<a[r]<<endl;
            break;
        }
    }

    if(!ok) puts("No Solution");
    //system("pause");
    return 0;
}

二分查找的做法。

  1. 令int型a[]数组存放读入的所有数,并在读入完毕后对数组a从小到大排序。
  2. 枚举a[0]、a[1]、... 、a[n-1],对每个a[i],用二分法查找数组内是否存在m-a[i],如果存在且下标不是i,则输出a[i]与m-a[i]。
  3. 如果枚举完毕还没有发现匹配的一对,则输出“No Solution”。

注意点

使用二分查找法找到m-a[i]时,必须判断其是否就是a[i],即下标是否相同。如果下标相同,则说明找到的其实是同一个位置的数字,应该跳过这种情况。

posted @ 2021-02-17 21:14  Dazzling!  阅读(19)  评论(0编辑  收藏  举报