【笔试】1、强迫卖家

小明是个强迫症卖家,有10000台设备,卖的均价要求最接近D元,输出卖出的台数N,总售价M  输入 0<D<10,精确到小数点后12位   ;   输出 M N

首先想得是暴力解答
然后是二分查找,寻找卖出多少台才符合要求,但是一直找不到符合要求的条件,只知道接近D

之后网上百度了一下答案,虽然解决方式不是二分查找,但是思想却是和二分查找差不多,这里做个记录
package y2020.interview.huawei.qiangpomaijia;

import java.util.Scanner;

/**
 * @Auther: xiaof
 * @Date: 2020/3/11 09:31
 * @Description:强迫卖家
 * 小明是个强迫症卖家,有10000台设备,卖的均价要求最接近D元,输出卖出的台数N,总售价M
 * 输入 0<D<10,精确到小数点后12位   ;   输出 M N
 *
 * 思路:
 * 均价与D相接近,初始化M,N为1。然后计算均价M/N。
 * 如果均价 > 幸运数D,则台数(分母)增加。
 * 如果均价 <= 幸运数D,则总售价(分子)增加。
 * 直到 M N 超出循环,其中取台数最小的一个
 */
public class Main {

    //3.14159265358979 不符合  错误答案
    public static long[] solution(double d) {
        //因为是1到10000台
        long[] res = {1, (int)d};
        double min = Double.MAX_VALUE;
        for (int i = 10000; i >= 1; --i) {
            double curM = i * d;
            //取整
            double preM = (i - 1) * d;
            double dir = curM - preM;
            if (dir < min) {
                min = dir;
                res[0] = i;
                res[1] = (long) (i * d);
            }
        }

        return res;
    }

    //网上大神思路
    public static int[] solution2(double d) {
        //因为是1到10000台
        int m = 1, n = 1, resm = 0, resn = 0;
        double dif = Double.MAX_VALUE;
        while (m < 100000 && n <= 10000) {
            if (Math.abs(m / (n * 1.0) - d) < dif) {
                //如果范围比这小
                resm = m; resn = n;
                dif = Math.abs(m / (n * 1.0) - d);
            }

            if ((m / (n * 1.0) - d) > 0) {
                //如果结果单价大了,那么就加大分子,也就是总价
                n++;
            } else {
                //大了,那就提高分母
                m++;
            }
        }
        return new int[]{resm, resn};
    }


    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        double d = scanner.nextDouble();

        int[] res = solution2(d);
        System.out.println(res[1] + " " + res[0]);

    }

}

 

posted @ 2020-03-12 11:05  cutter_point  阅读(2087)  评论(0编辑  收藏  举报