题目来源:http://ac.jobdu.com/problem.php?pid=1352
-
题目描述:
- 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
-
输入:
-
每个测试案例包括两行:第一行包含一个整数n和k,n表示数组中的元素个数,k表示两数之和。其中1 <= n <= 10^6,k为int第二行包含n个整数,每个数组均为int类型。
-
输出:
- 对应每个测试案例,输出两个数,小的先输出。如果找不到,则输出“-1 -1”
-
样例输入:
-
6 15 1 2 4 7 11 15
-
样例输出:
-
4 11
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 1000010;
bool FindNumbersSumequal(int* arr, int n, int &num1, int &num2, int S)
{
bool flag = false;
if(arr == NULL || n < 1)
return flag;
int iStart = 0;
int iEnd = n-1;
while(iStart < iEnd)
{
int iCurNum = arr[iStart] + arr[iEnd];
if(iCurNum == S)
{
num1 = arr[iStart];
num2 = arr[iEnd];
flag = true;
break;
}
else if(iCurNum < S)
++iStart;
else
--iEnd;
}
return flag;
}
int main()
{
int n, k, num1, num2, i, arr[MAXN];
while(scanf("%d %d", &n, &k) != EOF)
{
num1 = num2 = -1;
for(i = 0; i < n; ++i)
scanf("%d", &arr[i]);
if(FindNumbersSumequal(arr, n, num1, num2, k))
printf("%d %d\n", num1, num2);
else
printf("-1 -1\n");
}
return 0;
}