华为OD机试 -核酸检测人员安排(Java) | 机试题+算法思路+考点+代码解析 【2023】

华为OD机试 -核酸检测人员安排(Java) | 机试题+算法思路+考点+代码解析 【2023】_第1张图片

核酸检测人员安排

分值:100分

题目描述:

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

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

输入描述:

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

输出描述:

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

补充说明:

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

示例

输入:
2 2
200 200
输出:
400

解题思路:

华为OD机试 -核酸检测人员安排(Java) | 机试题+算法思路+考点+代码解析 【2023】_第2张图片
华为OD机试 -核酸检测人员安排(Java) | 机试题+算法思路+考点+代码解析 【2023】_第3张图片
华为OD机试 -核酸检测人员安排(Java) | 机试题+算法思路+考点+代码解析 【2023】_第4张图片
华为OD机试 -核酸检测人员安排(Java) | 机试题+算法思路+考点+代码解析 【2023】_第5张图片
华为OD机试 -核酸检测人员安排(Java) | 机试题+算法思路+考点+代码解析 【2023】_第6张图片
华为OD机试 -核酸检测人员安排(Java) | 机试题+算法思路+考点+代码解析 【2023】_第7张图片

代码实现:

import java.util.Scanner;

public class HeSuan {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        // 采样员数量
        int N = sc.nextInt();

        // 志愿者数量
        int V = sc.nextInt();

        // 采样员的效率
        int[] eff = new int[N];
        for (int i = 0; i < N; i++) {
            eff[i] = sc.nextInt();
        }

        int[][] dp = new int[N + 1][V + 1];

        for (int i = 1; i < N + 1; i++) {     //采集员数量
            for (int j = 0; j < V + 1; j++) {     //志愿者数量
                //当前人员(第i个采集人员)的效率,因为eff是从0开始,所以要减1
                int curEff = eff[i - 1];
                int M = (int) (0.1 * curEff);
                //最开始, dp[i][j] 取值为 当前采集员(第i个采集员),没有志愿者协助
                dp[i][j] = dp[i - 1][j] + curEff - 2 * M;
                if (j >= 1) {
                    //有 1 个志愿者协助当前采集员
                    dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - 1] + curEff);
                }
                if (j >= 2) {
                    //有 2 个志愿者协助当前采集员
                    dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - 2] + curEff + M);
                }
                if (j >= 3) {
                    //有 3 个志愿者协助当前采集员
                    dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - 3] + curEff + 2 * M);
                }
                if (j >= 4) {
                    //有 4 个志愿者协助当前采集员
                    dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - 3] + curEff + 3 * M);
                }
            }
        }
        System.out.println(dp[N][V]);
    }
}

你可能感兴趣的:(华为OD机试题,java,算法,开发语言)