当前位置: 代码迷 >> 综合 >> 合并检测
  详细解决方案

合并检测

热度:56   发布时间:2024-02-28 02:40:54.0

题目描述

    新冠疫情由新冠病毒引起,最近在 A 国蔓延,为了尽快控制疫情,A 国准

备给大量民众进病毒核酸检测。

    然而,用于检测的试剂盒紧缺。

    为了解决这一困难,科学家想了一个办法:合并检测。即将从多个人(k

个)采集的标本放到同一个试剂盒中进行检测。如果结果为阴性,则说明这 k

个人都是阴性,用一个试剂盒完成了 k 个人的检测。如果结果为阳性,则说明

至少有一个人为阳性,需要将这 k 个人的样本全部重新独立检测(从理论上看,

如果检测前 k 1 个人都是阴性可以推断出第 k 个人是阳性,但是在实际操作中

不会利用此推断,而是将 k 个人独立检测),加上最开始的合并检测,一共使用

了 k + 1 个试剂盒完成了 k 个人的检测。

    A 国估计被测的民众的感染率大概是 1%,呈均匀分布。请问 k 取多少能

最节省试剂盒?

    这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个

整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

 

思路:

感染比例是1%,假设总人数100人,枚举1~100个人一组,计算希望使用的试剂盒个数。

假设k个人一组检测,一共需要检测100/k次,这k个人都没病的概率是0.99^k,则至少有

一个人患病的概率就是1-0.99^k,设为概率为P。

则k个人一组检测期望使用的试剂盒个数为(1 + P * v) * 100 / k。

可以计算得到11的时候,期望次数最少。

#include <bits/stdc++.h>
#include <unordered_map>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;#ifdef LOCAL
#define debug(x) cout << "[" __FUNCTION__ ": " #x " = " << (x) << "]\n"
#define TIME cout << "RuningTime: " << clock() << "ms\n", 0
#else
#define TIME 0
#endif
#define hash_ 1000000009
#define Continue(x) { x; continue; }
#define Break(x) { x; break; }
const int mod = 1e9 + 7;
const int N = 2e5 + 10;
const int INF = 0x3f3f3f3f;
const ll LINF = 0x3f3f3f3f3f3f3f3f;
#define gc p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1000000, stdin), p1 == p2) ? EOF : *p1++;
inline int read(){ static char buf[1000000], *p1 = buf, *p2 = buf; register int x = false; register char ch = gc; register bool sgn = false; while (ch != '-' && (ch < '0' || ch > '9')) ch = gc; if (ch == '-') sgn = true, ch = gc; while (ch >= '0'&& ch <= '9') x = (x << 1) + (x << 3) + (ch ^ 48), ch = gc; return sgn ? -x : x; }
ll fpow(ll a, int b, int mod) { ll res = 1; for (; b > 0; b >>= 1) { if (b & 1) res = res * a % mod; a = a * a % mod; } return res; }
int main()
{
#ifdef LOCALfreopen("E:/input.txt", "r", stdin);
#endiflong double z = 1000;int k = -1;for (int i = 1; i <= 100; i++){long double u = 0.99;for (int j = 1; j < i; j++)u *= 0.99;long double v = (1 - u);long double w = 100.0 / i * (u + v * i);if (w < z){k = i;z = w;}} cout << k;return TIME;
}

 

 

  相关解决方案