蓝桥杯2020年第三题合并检测Java

题目:
新冠疫情由新冠病毒引起,最近在 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);
    }
}

题目答案:
在这里插入图片描述

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值