小明是个强迫症卖家,有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]);
}
}