3.合并检测(蓝桥杯CC++B组真题详解)

3.合并检测(蓝桥杯CC++B组真题详解),第1张

3.合并检测(蓝桥杯C/C++B组真题详解)

题目:

新冠疫情由新冠病毒引起,最近在 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:几孤风月,屡变星霜。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5710543.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存