题目:
新冠疫情由新冠病毒引起,最近在 A 国蔓延,为了尽快控制疫情,
A 国准 备给大量民众进病毒核酸检测。然而,用于检测的试剂盒紧缺。
为了解决这一困难,科学家想了一个办法:合并检测。
即将从多个人(k 个)采集的标本放到同一个试剂盒中进行检测。
如果结果为阴性,则说明这 k 个人都是阴性,用一个试剂盒完成了 k 个人的检测。
如果结果为阳性,则说明 至少有一个人为阳性,
需要将这 k 个人的样本全部重新独立检测(从理论上看,
如果检测前 k−1 个人都是阴性可以推断出第 k 个人是阳性,
但是在实际操作中 不会利用此推断,而是将 k 个人独立检测),
加上最开始的合并检测,一共使用 了 k + 1 个试剂盒完成了 k 个人的检测。
A 国估计被测的民众的感染率大概是 1%,呈均匀分布。
请问 k 取多少能 最节省试剂盒?
这是一道结果填空题,你只需要算出结果后提交即可。
本题的结果为一个 整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
题目解析:
本题由于感染的概率是1%,且位均匀分布,我们可以假设一共只有100个人,其中100个人中有一个人是被感染的。
我们将这100个人分为k组,此时有两种分发,一种是100可以被k整除,一种是不能被整除。
当100能被k整除时,例如当k为10时,我们首先要分为10组,10组中有一组肯定时含有1为的,然后含有阳性的那个组全员都要进行检测,然后有是10次,加在一起就是要有20个试剂盒。从中我们可以推出一个公式:试剂盒=100/k+k;
当100不能被k整除时,例如当k等于22,100就等于22+22+22+22+12,
这时那一个人可能在22个人中间,也可能在18个人之间,但是我们要考虑最坏的一种情况,就是那一个阳性在22个人中间,从中我们可以推出一个公式:试剂盒=100/k+1+k;
小知识:
Integer.MAX_VALUE指的是int类型的最大值,也就是2 147 483 647
至于为什么将sum设置为最大值,是因为在这个if(100/k+k<sum)中,如果你设置sum为0,则永远不会被执行,因为100/k+k一定是大于零的在本题中。
这也算一个小坑把。
具体的可以看这篇文章:
https://blog.csdn.net/weixin_44824500/article/details/104768290
题目代码:
package Test.Test_2020;
public class 合并检测 {
public static void main(String[] args) {
int sum=Integer.MAX_VALUE;
int min=0;
for (int k = 1; k <100; k++) {
if(100%k==0){
if(100/k+k<sum){
sum=100/k+k;
min=k;
}
}else if(100%k!=0){
if(100/k+k<sum){
sum=100/k+1+k;
min=k;
}
}
}
System.out.println(min);
}
}
题目答案: