0
点赞
收藏
分享

微信扫一扫

51Nod1001 数组中和等于K的数对(二分查找)


 刚看到这个题就想到了全部加一遍不就行了吗,就是下面的程序,结果有一个超时了。

#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
int main()
{
ll a[50001];
int i,j,k,n;
cin>>k>>n;
for(i=0;i<n;i++)
cin>>a[i];
sort(a,a+n);
int flag=0;
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
{
ll sum=a[i]+a[j];
if(sum>k)
break;
if(sum==k)
{
flag=1;
cout<<a[i]<<" "<<a[j]<<endl;
}
}
if(flag==0)
cout<<"No Solution"<<endl;
return 0;
}

那就在想别的思路吧。就想到了用二分查找k-a[i],比上面这个程序的时间复杂度n(o^2)肯定要快!

#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
ll a[50001];
int n;
int Find(ll x)
{
int l=0,r=n-1;
while(l<=r)
{
ll mid=(r+l)/2;
if(a[mid]==x) return 1;
if(a[mid]<x) l=mid+1;
else r=mid-1;
}
return 0;
}
int main()
{
int i,j,k;
cin>>k>>n;
for(i=0;i<n;i++)
cin>>a[i];
sort(a,a+n);
int flag=0;
for(i=0;i<n;i++)
{
if(a[i]>=k/2)
break;
if(Find(k-a[i]))
{
flag=1;
cout<<a[i]<<" "<<k-a[i]<<endl;
}
}
if(flag==0)
cout<<"No Solution"<<endl;
return 0;
}

 

举报

相关推荐

0 条评论