1001 数组中和等于K的数对——51NOD

这是我在51nod上做的第一道一级算法题,感觉51nod的低级题也没那么难嘛,这就是一道划水题,简单的二分查找就可解了。
我有两种解法,第一种想来效率没二分高,就是排序后分别从头和从后遍历,然后头指针只能向后,尾指针只能向前,这样就避免了一些重复,但是具体会不会TLE就没去尝试了。
第二种解法就是二分查找,我是在二分里揉进了第一种的思想,也避免了一部分重复,当然其实对于二分而言这点小重复也不会有太大的影响了,毕竟是O(log n)的复杂度。然后如果前后指针相遇的时候就不用重复了,所以我的复杂度应该是O(nlogn)

题目如下:
这里写图片描述

代码:

#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define MAX_LEN 50001

int sum=0;

int searchAndOutput(LL *a,int start,int tail,LL k)
{
    LL need = k-a[start];

    start++;
    int s=start,t=tail,m;
    m=(tail-start)/2;
    while(s <= t)
    {
        if(a[m] == need)
        {
            if(a[start-1] == a[m])
            {
                return tail;
            }
            cout<<a[start-1]<<" "<<a[m]<<endl;
            sum++;
            return m;
        }
        if(a[m] > need)
        {
            t = m-1;
            m=(s+t)/2;
        }
        else if(a[m] < need)
        {
            s = m+1;
            m=(s+t)/2;
        }
    }
    return tail;

}


int main()
{
    LL k;
    int n;
    cin>>k>>n;
    int t=n;
    LL a[MAX_LEN];
    while(n--)
    {
        cin>>a[n];
    }
    n=t-1;
    sort(a,a+t);

    int i=0;
    while(i<n)
    {
        n=searchAndOutput(a,i,n,k);
        i++;
    }
    if(sum == 0)
    {
        cout<<"No Solution"<<endl;
    }

}


posted @ 2018-01-08 14:26  _吟游诗人  阅读(127)  评论(0编辑  收藏  举报