【题目描述】
给出若干个整数,询问其中是否有一对数的和等于给定的数。
【输入】
第一行是整数n(0 < n ≤ 100,000),表示有n个整数。
第二行是n个整数。整数的范围是在00到108108之间。
第三行是一个整数m(0≤m≤230)m(0≤m≤230),表示需要得到的和。
【输出】
若存在和为m的数对,输出两个整数,小的在前,大的在后,中间用单个空格隔开。若有多个数对满足条件,选择数对中较小的数更小的。若找不到符合要求的数对,输出一行No。
【输入样例】
4
2 5 1 4
6
【输出样例】
1 5
这道题我原来使用的二分搜索哈,但是不知道为啥,错了,我把错误代码和AC代码都放着,哪位大佬知道我错在哪里,替我指出哈!谢谢谢谢。
//AC代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#define N 1000001
using namespace std;
int a[N];
int main()
{
long long n, m, i, j;
int tot = 0;
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
cin >> m;
sort(a + 1, a + 1 + n);
i = 1; j = n;
while (i < j)
{
if (m-a[i]==a[j])
{
cout << a[i] << " " << a[j] << endl;
return 0;
}
else if (m-a[i]>a[j])
i++;
else
j--;
}
cout << "No" << endl;
return 0;
}
//错误代码
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<stdio.h>
#define N 100001
using namespace std;
long long n, m, a[N];
bool judge(int x)
{
int left = 0, right = n - 1;
while (left <= right)
{
int mid =(left + right) / 2;
if (x > a[mid])
{
left = mid+1;
}
if (x < a[mid])
{
right = mid;//1 2 4 5
}
if (x == a[mid])
{
return true;
}
}
return false;
}
int main()
{
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
cin >> m;
sort(a, a + n);//进行排序
int tmp = m;
for (int i = 0; i < n; i++)
{
if (tmp - a[i] != a[i])
{
if (judge(tmp - a[i]) == true)
{
cout << a[i] << " " << tmp - a[i] << endl;
return 0;
}
}
else
{
continue;
}
}
cout << "No" << endl;
return 0;
}
感谢支持!