-
总时间限制:
- 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
问题链接:Bailian4143 和为给定数
问题分析:这个问题排序后处理起来就比较方便,可以从小开始试探(a[i]),并使用二分查找看是否存在另外一个数使之和为m。程序说明:(略)
题记:排序和二分是最为常见的算法。
AC的C++语言程序如下:
/* Bailian4143 和为给定数 */
#include <iostream>
#include <algorithm>
#include <stdio.h>
using namespace std;
const int N = 100000;
int a[N];
bool search(int v, int start, int end)
{
int mid;
while(start <= end) {
mid = (end + start) / 2;
if(a[mid] == v)
return true;
else if(a[mid] > v)
end = mid - 1;
else if(a[mid] < v)
start = mid + 1;
}
return false;
}
int main()
{
int n, m;
bool noflag;
scanf("%d", &n);
for(int i=0; i<n; i++)
scanf("%d", &a[i]);
scanf("%d", &m);
sort(a, a + n);
noflag = true;
for(int i=0; i<n-1; i++)
if(search(m - a[i], i + 1, n - 1)) {
printf("%d %d\n", a[i], m - a[i]);
noflag = false;
break;
}
if(noflag)
printf("No\n");
return 0;
}