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;
}
}