题目:
新冠疫情由新冠病毒引起,最近在 A 国蔓延,为了尽快控制疫情,A 国准 备给大量民众进病毒核酸检测。
然而,用于检测的试剂盒紧缺。为了解决这一困难,科学家想了一个办法:合并检测。即将从多个人(k 个)采集的标本放到同一个试剂盒中进行检测。如果结果为阴性,则说明这 k 个人都是阴性,用一个试剂盒完成了 k 个人的检测。如果结果为阳性,则说明 至少有一个人为阳性,需要将这 k 个人的样本全部重新独立检测(从理论上看, 如果检测前 k−1 个人都是阴性可以推断出第 k 个人是阳性,但是在实际操作中 不会利用此推断,而是将 k 个人独立检测),加上最开始的合并检测,一共使用 了 k + 1 个试剂盒完成了 k 个人的检测。
A 国估计被测的民众的感染率大概是 1%,呈均匀分布。请问 k 取多少能最节省试剂盒?
设检测人数为100人,根据概率为1%,则只有1个为阳性。k个人一组,则需要的试剂数量为:对所有分组进行合并检测所需要的试剂数100/k+其中1个分组阳性所需要的试剂数k+未分组人数所需的试剂数量。
分析:
检测人数是100
分两种情况
第一种:试剂盒数量能被100整除,那么就一共需要100/k+k个盒子。如k=20.则有五组,
因为是均匀分布所以这五组里面有一组是阳性,则那一组需要所有人全再测一遍,也就是100/k+k
第二种:试剂盒数量不能被100整除,那么就一共需要100/k+k+1个盒子。如k=40.
则有三组,40,40,20,考虑到最坏情况,需要加上40也就是100/k+k+1
Integer.MAX_VALUE指的是int类型的最大值,也就是2 147 483 647
大概步骤
1。遍历可能出现的每个组的容纳人数数量。
2。两种情况。能被整除,和不能被整除
3。从1开始到100,这是所有可能出现的每个组数量,把这100个数值,一直按照上面100/k+k,100/k+k+1这两个找盒子数量,只要下一个小,那么就把相对应的k值更新到hezi中。
步骤:
![](https://img-blog.csdnimg.cn/img_convert/1e7800fa3265c87164ef8252d57d6ae6.png)
package a28;
public class 合并检测28 {
public static void main(String[] args) {
int min = Integer.MAX_VALUE;// 取最大值
int hezi = 0;// 用于记录需要最小的检测盒
for (int i = 1; i < 100; i++) {
if (100 % i == 0) { // 100人能被整除
if (100 / i + i < min) {
min = 100 / i + i;// 这一次需要的盒子
hezi = i;// 把组给hezi
}
} else if (100 % i != 0) { // 100人不能被整除
if (100 / i + 1 + i < min) {
min = 100 / i + 1 + i;// 这一次需要的盒子
hezi = i;// 把组给hezi
}
}
}
System.out.println(hezi);
}
}