隐藏条件:可以将多人的血液混合后使用一个试剂盒进行检测,有一人及以上的血液中含有病毒,则试剂盒显示为阳性,否则试剂盒显示为阴性. 思考方向:递归求解 检测过程拆解: 假设一共有N人,其中p人感染病毒(1<=p<=N),记S(N, p)表示解决问题需要花费的试剂盒数量. 1) 显然有递归边界:S(N, N) = 0,其含义是N人全感染则使用0个试剂盒就能解决问题. 2) 假设只有一位检测医生,即试剂盒的使用是串行的,不能并行使用试剂盒,只有当上一个试剂盒的结果出来后,才能去仓库拿取下一个试剂盒. 所以,检测医生当前手上的这个试剂盒只有两种使用方式:一是只检测一个人,二是从待检测人中抽取多人进行混合血液检测. 设医生从N人中随机抽取k人(1<=k<=N-p),然后将他们的血液混合后导入试剂盒, ① 当 p = 1 时(即N中只有一人感染的情况), 如果k个人混血检测结果为阳性,说明仅有的一位感染者在这k人当中,即S(N, 1) = S(k, 1) + 1,加一是指已经耗费的一个试剂盒;如果k个人混血检测结果为阴性,说明仅有的一位感染者在剩余的N-k人当中,即S(N, 1) = S(N-k, 1) + 1. 我们使用两者最坏的情况进行计算,因此,S(N, 1) = max{S(k, 1) + 1, S(N-k, 1) + 1}. ② 当 p > 1 时(即N中有多人感染的情况), a) 当 k < p 时(此时不管k人混血检测结果阴阳,N-k人中肯定还存在感染者) 如果(k人检测结果为阴性){ S(N, p) = S(N-k, p) + 1 } 否则{ k人中和N-k人中都有感染者. 例如p=5,则有(1,4)(2,3)(3,2)(4,1)四种可能性,比如(1,4)这种情况成递推公式就是: S(N, 5) = S(k, 1) + S(N-k, 4) + 1. } 最后,取各个情况最大值.

相关推荐

牛客网
牛客企业服务