您的位置:首页 > 编程语言 > C语言/C++

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

2018-01-08 14:26 295 查看
这是我在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=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;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息