和为S的两个数字

来源:互联网 发布:出售淘宝成品店铺 编辑:程序博客网 时间:2024/04/29 17:19


题目描述:

输入一个递增排序的数组和一个数字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");     }}


0 0
原创粉丝点击