第十一届蓝桥杯(B组)----合并检测

【问题描述】 新冠疫情由新冠病毒引起,最近在 A 国蔓延,为了尽快控制疫情,A 国准 备给大量民众进病毒核酸检测。
然而,用于检测的试剂盒紧缺。 为了解决这一困难,科学家想了一个办法:合并检测。即将从多个人(k 个)采集的标本放到同一个试剂盒中进行检测。如果结果为阴性,则说明这 k 个人都是阴性,用一个试剂盒完成了 k 个人的检测。如果结果为阳性,则说明 至少有一个人为阳性,需要将这 k 个人的样本全部重新独立检测(从理论上看, 如果检测前 k−1 个人都是阴性可以推断出第 k 个人是阳性,但是在实际操作中 不会利用此推断,而是将 k 个人独立检测),加上最开始的合并检测,一共使用 了 k + 1 个试剂盒完成了 k 个人的检测。 A 国估计被测的民众的感染率大概是 1%,呈均匀分布。请问 k 取多少能 最节省试剂盒?

题目大意:

总数为 sum 的人需要分成 k 组每一组 sum / k 个人做核酸检测,如果有一组中出现阳性,则这个组的每个人都需要单独做一次核酸。这时试剂盒总数= k + ( sum / k ) ,现在有 0.01 * sum 个阳性人员并平均的分布在总人数中(即如果有5个组5个阳性,则每个组一个阳性)。

其实如果不懂也可以随便蒙一个答案,平时核酸检测都是10人一组,肯定有其道理的。

思路:

1、设出有多少个人需要检测,并求出有多少个阳性。

2、暴力枚举,每一组的人数,然后计算即可。

注意:

如果分组的时候,剩下不够凑成一组的人时,直接令他们为一组检测即可,而且阳性人员不会在人数不够的一组人里面(均匀分布嘛)。

这里我直接算总人数为100的情况。其它的与之类似。

#include <stdio.h>
#include <math.h>
#include <algorithm>
#include <iostream>
#include <string.h>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
using namespace std;
#define ll long long
int t=100,ans=100000,temp=10000;//t是总人数,ans是最少的分组人数
int main() {//temp用来记录最少的检测盒子总数
    for(int i=1; i<100; i++) {//每组的人数
        int zu=100/i;//一共有多少组
        int mi=zu+i;//100个人只有一个是阳性,说明只有一组需要每个人做核酸
        if(100%i!=0) {//如果分完组还剩下一些人,直接按一组计算
            mi++;
        }
        if(mi<temp) {//如果当前检测盒子总数小于temp,则更新temp,ans
            temp=mi;
            ans=i;//记录每一组最小的人数
        }
    }
    cout<<ans<<endl;
    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值