题目描述:
输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
思路:由于看到递增排序想到二分查找,找一个数字然后二分另外一个数字。。wa了。。看了其他人的做法:
前后两个指针,如果所指元素和等于S,即可输出。。而且保证乘积最小
如果和大于S,后面那个指针减去一,如果和小于S,前面那个指针加一
代码如下:
#include <iostream>
using namespace std;
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <vector>
#include <map>
#include <queue>
#include <stack>
#include <set>
int s[1000005];
int main(){
int n,k;
int beg,end;
bool tag;
while(scanf("%d%d",&n,&k) != EOF){
for(int i = 0;i < n;i++){
scanf("%d",&s[i]);
}
beg = 0,end = n-1;
tag = false;
while(beg < end){
if(s[beg] + s[end] == k){
tag = true;
break;
}else if(s[beg] + s[end] < k){
beg++;
}else{
end--;
}
}
if(tag)
printf("%d %d\n",s[beg],s[end]);
else
printf("-1 -1\n");
}
}