【蓝桥杯】最优分组

最优分组

小蓝开了一家宠物店,最近有一种 X 病毒在动物之间进行传染,小蓝为了以防万一打算购买测试剂对自己的宠物进行病毒感染测试。

为了减少使用的测试剂数目,小蓝想到了一个好方法:将 N 个宠物平均分为若干组,使得每组恰好有 K 只宠物,这样对同一组的宠物进行采样并混合后用一个试剂进行检测,如果测试结果为阴性则说明组内宠物都未感染 X 病毒;如果是阳性的话则需要对组内所有 K 只宠物单独检测,需要再消耗 K 支测试剂(当 K=1 时,就没必要再次进行单独检测了,因为组内只有一只宠物,一次检测便能确认答案)。

现在我们已知小蓝的宠物被感染的概率为 p,请问 K 应该取值为多少才能使得期望的测试剂的消耗数目最少?

如果有多个答案输出最小的 K。

输入格式

第一行,一个整数 N。

第二行,一个浮点数 p。

输出格式

输出一行,一个整数 K 表示答案。

数据范围

对于 30% 的评测用例:1≤N≤10。
对于 60% 的评测用例:1≤N≤1000。
对于 100% 的评测用例:1≤N≤ 1 0 6 10^6 106,0≤p≤1。

输入样例:
1000
0.05
输出样例:
5

一共有n / k 组
每组有k头宠物,每头宠物发病概率是p,不发病的概率是 1 - p
所有宠物都不发病的概率是 ( 1 − p ) k (1 - p) ^ k (1p)k,这种情况需要1只药剂
至少有一头宠物发病的概率是 1 − ( 1 − p ) k 1 - (1 - p) ^ k 1(1p)k, 这种情况,这一组需要 k + 1只药剂
每组需要药剂的期望是 ( 1 − p ) k ∗ 1 + 1 − ( 1 − p ) k ∗ ( k + 1 ) (1 - p) ^ k * 1 + 1 - (1 - p) ^ k * (k + 1) (1p)k1+1(1p)k(k+1)

import java.util.*;
import java.io.*;
public class Main {
    static final int N = 1000010;
    public static void main(String[] args) throws Exception{
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        double p = sc.nextDouble();
        int res = 1;
        double medicament = N + 1;
        //因为题目要求是每组恰好是k只宠物,所以要保证n能够被k整除
        for(int k = 2; k < n + 1; k++) {
            if(n % k == 0) {
                //一共有n / k 组
                //每组有k头宠物,每头宠物发病概率是p,不发病的概率是 1 - p
                //所有宠物都不发病的概率是 (1 - p) ^ k,这种情况需要1只药剂
                //至少有一头宠物发病的概率是 1 - (1 - p) ^ k, 这种情况,这一组需要 k + 1只药剂
                //每组需要药剂的期望是 (1 - p) ^ k * 1 +  1 - (1 - p) ^ k * (k + 1)
                double num = (n / k) * (Math.pow(1 - p, k) + (1 - Math.pow(1 - p, k)) * (k + 1));
                if (num <= medicament) {
                    medicament = num;
                    res = k;
                }
            }
        }
        System.out.println(res);
        sc.close();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值