题目:
新冠疫情由新冠病毒引起,最近在 A 国蔓延,为了尽快控制疫情, A 国准备给大量民众进病毒核酸检测。
然而,用于检测的试剂盒紧缺。
为了解决这一困难,科学家想了一个办法:合并检测。即将从多个人( k 个)采集的标本放到同一个试剂盒中进行检测。如果结果为阴性,则说明这 k 个人都是阴性,用一个试剂盒完成了 k 个人的检测。如果结果为阳性,则说明至少有一个人为阳性,需要将这 k 个人的样本全部重新独立检测(从理论上看,如果检测前 k−1 个人都是阴性可以推断出第 k 个人是阳性,但是在实际 *** 作中不会利用此推断,而是将 k 个人独立检测),加上最开始的合并检测,一共使用了 k+1 个试剂盒完成了 k 个人的检测。
A 国估计被测的民众的感染率大概是 1%,呈均匀分布。请问 k 取多少能最节省试剂盒?
解题思路:
该题如果设人数为一个未知数m,然后进行计算可能会让人搞糊涂。
我们采用直接设定人数为100人
假设有一人被感染(满足题目感染率为1%)
再从1到100通过代码逐步确认 k 的值
让使用的试剂盒为最少
通过特列推算到通解
解题代码:
【注意事项,这里对于使用试剂盒的次数使用采用小数点的记录方式,是因为当总人数足够大的时候,产生的小数点后的试剂盒使用次数,依旧会对k的取值造成影响】
【例如当总人数为100,k取10的时候(20个试剂盒)和k取8的时候(约20.84次试剂盒)】
#include#include using namespace std; int main() { float minn = 100; float x, y,t; for (int k = 1; k <= 100; k++) { if (100 % k == 0)//k能被100整除的情况 { if (100 / k + k < minn)//对 试剂盒使用量 进行比较,并记录下最少使用量下的k值 { t = k; minn = 100 / k + k; } } else//k不能被100整除,存在最后检测不够k人的情况 { //感染的人在 一次测试k人 之中 x = (100 / k + k + 1) * (100 - 100 % k) / 100.0; //感染的人在 一次测试不够k人 之中 y = (100 / k + 1 + 100 % k) * (100 % k) / 100.0; if (x + y < minn)//对 试剂盒使用量 进行比较,并记录下最少使用量下的k值 { t = k; minn = x + y; } } } cout < 总结:该题主要考察思维能力,以及是否能采用以特殊的例子直接推出通解的方法(这样会加快你做题的速度)
PS:几孤风月,屡变星霜。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)