您的位置:首页 > 理论基础 > 计算机网络

acm成都赛区网络热身赛 Sum

2010-09-16 22:02 281 查看
题目大意:给你一个n和x;n的范围(n<=1000001),n表示有n个数,在这n个数查找是否有两个数之和为x的,如果有就输出“YES”,没有"NO".

Sample Input

3 3
1 2 3
2 3
1 3


Sample Output

YES
NO

最后我编了一组测试数据;

3 16

1 8 16

NO

用二分查找解决,比如第一组测试数据,只要在x-a[i]即可,注意点,要把a[i]标记一下要不然搜索第二个元素时搜到8结果就是YES,其实是错的,开始这个地方欠考虑:虽然一下想到了,但是在敲代码时还是遇到一些小麻烦,最后ko了。

<code>

#include<iostream>
#include<algorithm>
using namespace std;
int a[1000005];
int index;
int Binary_Search(int x,int n)
{
int left=0,right=n-1;
while(left<=right)
{
int middle=(left+right)/2;
if(a[middle]==x&&x!=index)return middle;
if(x>a[middle])left=middle+1;
else right=middle-1;
}
return -1;
}
int main()
{
int n,x,i;
while(cin>>n>>x)
{

for(i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a,a+n);
if(a[0]>=x)
{
cout<<"NO"<<endl;
continue;
}
int flag=0;
for(i=0;i<n,a[i]<x;i++)
{
index=a[i];
if(Binary_Search(x-a[i],n)!=-1)
{
cout<<"YES"<<endl;
flag=1;
break;
}

}
if(!flag)cout<<"NO"<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: