核酸检测人员安排

题目描述:

在系统、网络均正常的情况下组织核酸采样员和志愿者对人群进行核酸检测筛查。每名采样员的效率不同,采样效率为N人/小时。由于外界变化,采样员的效率会以M人/小时为粒度发生变化,M为采样效率浮动粒度,M=N10%,输入保证N10%的结果为整数。采样员效率浮动规则:采样员需要一名志愿者协助组织才能发挥正常效率,在此基础上,每增加一名志愿者,效率提升1M,最多提升3M;如果没有志愿者协助组织,效率下降2M。

怎么安排速度最快?求总最快检测效率(总检查效率为各采样人员效率值相加)。

输入描述:

第一行:第一个值,采样员人数,取值范围[1,100];第二个值,志愿者人数,取值范围[1,500];
第二行:各采样员基准效率值(单位人/小时),取值范围[60,600],保证序列中每项值计算10%为整数

输出描述:

第一行:总最快检测效率(单位人/小时)

补充说明:
输入需要保证采样员基准效率值序列的每个值*10%为整数

示例

输入:
2 2
200 200
输出:
400

题目解析

解题思路

求最优解,可以考虑使用动态规划的方式实现。而动态规划主要是设置状态转移方程。
状态转移方程思路:
每次新增加一个医生,需要考虑给他配置几个志愿者【0,1,2,3】才能最优
dp[M:医生数][N:志愿者数量] 【注意: dp[M-1]的所有状态已经得到最优解了 】

  • 如果不分配志愿者,则=dp[M-1][N] + 该医生效率减少20%
  • 如果分配1个志愿者,则=Max(不分配志愿者,dp[M-1][N-1]+该医生效率)
  • 如果分配2个志愿者,则=Max(分配1个志愿者,dp[M-1][N-2]+该医生效率+提升2倍效率)
  • 如果分配3个志愿者,则=Max(分配2个志愿者,dp[M-1][N-3]+该医生效率+提升3倍效率)
    注意:以上需要按顺序比较

java代码实现

package com.HW;

import javax.net.ssl.HandshakeCompletedListener;
import java.util.Arrays;
import java.util.Collections;

/**
 * @ClassName : TNucleicAcidTesting
 * @Author : kele
 * @Date: 2023/10/22 14:42
 * @Description : 核酸检测人员安排
 */
public class TNucleicAcidTesting {
   


    public static void main(String[] args) {
   
        handle("2 2", "200 200");
    }

    

你可能感兴趣的:(华为od,算法,java,华为od)