【问题描述】 新冠疫情由新冠病毒引起,最近在 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;
}