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

本文探讨了新冠病毒核酸检测中合并检测策略的数学模型,并通过编程找出最节省试剂盒的检测人数k值,以应对疫情中试剂盒紧缺的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

新冠疫情由新冠病毒引起,最近在 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<stdio.h>
#include<iostream>
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 <<t;
	return 0;
}

总结:该题主要考察思维能力,以及是否能采用以特殊的例子直接推出通解的方法(这样会加快你做题的速度)

PS:几孤风月,屡变星霜。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CTGU-Yoghurt

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值