总时间限制:
1000ms
内存限制:
65536kB
描述
给出若干个整数,询问其中是否有一对数的和等于给定的数。
输入
共三行:第一行是整数n(0 < n <= 100,000),表示有n个整数。第二行是n个整数。整数的范围是在0到10^8之间。第三行是一个整数m(0 <= m <= 2^30),表示需要得到的和。
输出
若存在和为m的数对,输出两个整数,小的在前,大的在后,中间用单个空格隔开。若有多个数对满足条件,选择数对中较小的数更小的。若找不到符合要求的数对,输出一行No。
样例输入
4
2 5 1 4
6
样例输出
1 5
using namespace std;
int a[100000],m,n,p,l1,l2;
int ss(int x,int l,int r)
{ int mid=(l+r)/2;
if (l>r)
return 0;
else
{if (a[mid]>x)
ss(x,l,mid-1);
if (a[mid]
ss(x,mid+1,r);
if (a[mid]==x)
return mid;
}
}
int main()
{ cin>>n;
for (int i=1;i<=n;++i)
cin>>a[i];
cin>>m;
sort(a+1,a+1+n);
for (int i=1;i<=n-1;++i)
{ int b;
b=ss(m-a[i],i+1,n);
if (b)
{ p=1;
l1=i;
l2=b;
break;
}
}
if (p==0)
cout<<"No";
else
cout<<a[l1]<<" "<<a[l2];
}
技巧:从小到大排序。