时间限制: 1000 ms 内存限制: 65536 KB
提交数: 4550 通过数: 1576
【题目描述】
给出若干个整数,询问其中是否有一对数的和等于给定的数。
【输入】
第一行是整数n(0 < n ≤ 100,000),表示有n个整数。
第二行是n个整数。整数的范围是在0
到108
之间。
第三行是一个整数m(0≤m≤230)
,表示需要得到的和。
【输出】
若存在和为m的数对,输出两个整数,小的在前,大的在后,中间用单个空格隔开。若有多个数对满足条件,选择数对中较小的数更小的。若找不到符合要求的数对,输出一行No。
【输入样例】
4 2 5 1 4 6
【输出样例】
1 5
解题:
二分查找,由于需要的第一个数是最小的,则我们假定第一个数已知,我们
寻找第二个数。
代码如下
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void find(vector<int> &a, int m)
{
sort(a.begin(), a.end());
int l = 0;
int r = a.size() - 1;
int k = 0;
int mid = (l + r) / 2;;
for (int i = 0; i < a.size(); i++)
{
k = m - a[i];
while (l <= r)
{
mid = (l + r) / 2;
if (a[mid] == k)
{
cout << a[i] << " " << a[mid] << endl;
return;
}
if (a[mid] > k)
{
r = mid - 1;
}
if (a[mid] < k)
{
l = mid + 1;
}
}
}
}
void main()
{
vector<int> a;
int n;
int m;
cin >> n;
for (int i = 0; i < n; i++)
{
int t = 0;
cin >> t;
a.push_back(t);
}
cin >> m;
find(a, m);
system("pause");
}