zoukankan      html  css  js  c++  java
  • 和为S的两个数字

    题目描述

    输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 
    输出描述:
    对应每个测试案例,输出两个数,小的先输出。
    思路:两个数的和一定,差越小,乘积越大;差越大,乘积越小。
        两个数的乘积一定,差越小,和越小。
    证明:已知x+y=c,求x*y的最小值。
    x*y=x*(c-x)=-x^2+cx = -(x-c/2)^2+c^2/4。由此可见,当x越接近c/2时,乘积越大,此时y也越接近c/2。所以两者相近越小时,乘积越大,逆否命题为两者相近越大时,乘积越小。
    ublic ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
            ArrayList<Integer> list = new ArrayList<>();
            int num1=0;
            int num2 = 0;
            int aHead = 0;
            int end = array.length-1;
            while(aHead<end){
                int temp = array[aHead]+array[end];
                if(temp>sum){
                    end--;
                }else if(temp<sum){
                    aHead++;
                }else{
                    num1 = array[aHead];
                    num2 = array[end];
                    break;
                }
            }
            if(aHead<end){
                list.add(num1);
                list.add(num2);
            }
            return list;
        }
  • 相关阅读:
    P4005 小 Y 和地铁
    P1039 侦探推理
    P2766 最长不下降子序列问题
    P2312 解方程
    P2169 正则表达式
    UOJ#22. 【UR #1】外星人
    UOJ#21. 【UR #1】缩进优化
    Palindromeness CodeChef
    bzoj5392 [Lydsy1806月赛]路径统计
    997D Cycles in product
  • 原文地址:https://www.cnblogs.com/yingpu/p/5829501.html
Copyright © 2011-2022 走看看