最优分组
小蓝开了一家宠物店,最近有一种 X 病毒在动物之间进行传染,小蓝为了以防万一打算购买测试剂对自己的宠物进行病毒感染测试。
为了减少使用的测试剂数目,小蓝想到了一个好方法:将 N 个宠物平均分为若干组,使得每组恰好有 K 只宠物,这样对同一组的宠物进行采样并混合后用一个试剂进行检测,如果测试结果为阴性则说明组内宠物都未感染 X 病毒;如果是阳性的话则需要对组内所有 K 只宠物单独检测,需要再消耗 K 支测试剂(当 K=1 时,就没必要再次进行单独检测了,因为组内只有一只宠物,一次检测便能确认答案)。
现在我们已知小蓝的宠物被感染的概率为 p,请问 K 应该取值为多少才能使得期望的测试剂的消耗数目最少?
如果有多个答案输出最小的 K。
输入格式
第一行,一个整数 N。
第二行,一个浮点数 p。
输出格式
输出一行,一个整数 K 表示答案。
数据范围
对于 30% 的评测用例:1≤N≤10。
对于 60% 的评测用例:1≤N≤1000。
对于 100% 的评测用例:1≤N≤
1
0
6
10^6
106,0≤p≤1。
输入样例:
1000
0.05
输出样例:
5
一共有n / k 组
每组有k头宠物,每头宠物发病概率是p,不发病的概率是 1 - p
所有宠物都不发病的概率是
(
1
−
p
)
k
(1 - p) ^ k
(1−p)k,这种情况需要1只药剂
至少有一头宠物发病的概率是
1
−
(
1
−
p
)
k
1 - (1 - p) ^ k
1−(1−p)k, 这种情况,这一组需要 k + 1只药剂
每组需要药剂的期望是
(
1
−
p
)
k
∗
1
+
1
−
(
1
−
p
)
k
∗
(
k
+
1
)
(1 - p) ^ k * 1 + 1 - (1 - p) ^ k * (k + 1)
(1−p)k∗1+1−(1−p)k∗(k+1)
import java.util.*;
import java.io.*;
public class Main {
static final int N = 1000010;
public static void main(String[] args) throws Exception{
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
double p = sc.nextDouble();
int res = 1;
double medicament = N + 1;
//因为题目要求是每组恰好是k只宠物,所以要保证n能够被k整除
for(int k = 2; k < n + 1; k++) {
if(n % k == 0) {
//一共有n / k 组
//每组有k头宠物,每头宠物发病概率是p,不发病的概率是 1 - p
//所有宠物都不发病的概率是 (1 - p) ^ k,这种情况需要1只药剂
//至少有一头宠物发病的概率是 1 - (1 - p) ^ k, 这种情况,这一组需要 k + 1只药剂
//每组需要药剂的期望是 (1 - p) ^ k * 1 + 1 - (1 - p) ^ k * (k + 1)
double num = (n / k) * (Math.pow(1 - p, k) + (1 - Math.pow(1 - p, k)) * (k + 1));
if (num <= medicament) {
medicament = num;
res = k;
}
}
}
System.out.println(res);
sc.close();
}
}