zoukankan      html  css  js  c++  java
  • 【笔试】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]);
    
        }
    
    }
  • 相关阅读:
    ASP.NET中FileUpload中的代码怎么编写?
    JQuery EasyUI 根据数据动态生成datagrid,统计常用
    JQuery EasyUI window 用法
    jQuery EasyUI DataGrid 分页 FOR ASP.NET
    SQL server 2008 不允许保存更改,您所做的更改要求删除并重新创建以下表 的解决办法
    javascript 判断浏览器客户端
    Access, SQL Server, and Oracle数据类型的对应关系
    asp.net中的模态对话框
    [转]C++获取Windows时间的方法总结
    [转]Oracle开发与使用文章收藏
  • 原文地址:https://www.cnblogs.com/cutter-point/p/12467801.html
Copyright © 2011-2022 走看看