首页 > 代码库 > 剑指OFFER之和为S的两个数字

剑指OFFER之和为S的两个数字

题目描述:
输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
输入:
每个测试案例包括两行:
第一行包含一个整数n和k,n表示数组中的元素个数,k表示两数之和。其中1 <= n <= 10^6,k为int
第二行包含n个整数,每个数组均为int类型。
输出:
对应每个测试案例,输出两个数,小的先输出。如果找不到,则输出“-1 -1”
样例输入:
6 151 2 4 7 11 15
样例输出:
4 11

Code:
#include <cstdio>#include <algorithm>#define INF 0x7fffffffffffffff   //考虑到long long 类型,8个字节 using namespace std; int arr[1000010]; int main(){    int n,k,num1,num2;    int *head,*tail;    long long minVal;    bool havaAnswer;    while(scanf("%d%d",&n,&k)!=EOF){        for(int i=0;i<n;++i){            scanf("%d",&arr[i]);        }        head=arr;        tail=arr+n-1;        minVal=INF;        havaAnswer=false;        while(head<tail){            if(*head+*tail==k){                havaAnswer=true;                if((long long)(*head)*(*tail)<minVal){                    num1=*head;                    num2=*tail;                    minVal=(long long)(*head)*(*tail);                }                ++head;                --tail;            }else{                if(*head+*tail<k){                    ++head;                }else{                    --tail;                }            }        }        if(havaAnswer){            int a=num1,b=num2;            if(num1>num2){                a=num1;                b=num2;            }            printf("%d %d\n",a,b);        }else{            printf("%d %d\n",-1,-1);        }    }    return 0;} /**************************************************************    Problem: 1352    User: lcyvino    Language: C++    Result: Accepted    Time:1430 ms    Memory:5424 kb****************************************************************/

 

剑指OFFER之和为S的两个数字