【笔试】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]); } }