目录
- 一、题目描述
- 二、输入描述
- 三、输出描述
- 四、补充说明
- 五、Python算法源码
- 六、效果展示
- 1、输入
- 2、输出
一、题目描述
在系统、网络均正常的情况下组织核酸采样员和志愿者对人群进行核酸检测筛查。
每名采样员的效率不同,采样效率为N人/小时。
由于外界变化,采样员的效率会以M人/小时为粒度发生变化,M为采样效率浮动粒度,M = N * 10%,输入保证N * 10%的结果为整数。
采样员效率浮动规则:
采样员需要一名志愿者协助组织才能发挥正常水平,在此基础上,每增加一名志愿者,效率提升1M,最多提升3M;
如果没有志愿者协助组织,效率下降2M。
怎么安排速度最快?求总最快检测效率(总检测效率为各采样人员效率值相加)。
二、输入描述
第一行:第一个值,采样员人数,取值范围[1,100];第二个值,志愿者人数,取值范围[1,500]。
第二行:各采样员基准效率值(单位人/小时),取值范围[60,600],保证序列中每项值计算10%为整数。
三、输出描述
总最快检测效率(单位人/小时)。
四、补充说明
输入需要保证采样员基准效率值序列的每个值 * 10%为整数。
五、Python算法源码
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
String[] strings = str.split(" ");
//采集人员人数
int m = Integer.parseInt(strings[0]);
//志愿者人数
int n = Integer.parseInt(strings[1]);
// 各采样员基准效率值
int[] efficiencyArr = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
//动态规划的方程
int[][] dp = new int[m + 1][n + 1];
for (int i = 1; i <= m; i++) {
for (int j = 0; j <= n; j++) {
//当前采集人员的效率
int curEff = efficiencyArr[i - 1];
int M = (int) (0.1 * curEff);
//最开始, dp[i][j] 取值为 当前采集员(第i个采集员),没有志愿者协助
dp[i][j] = dp[i - 1][j] + curEff - 2 * M;
//有 1 个志愿者协助当前采集员
if (j >= 1) {
dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - 1] + curEff);
}
//有 2 个志愿者协助当前采集员
if (j >= 2) {
dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - 2] + curEff + M);
}
//有 3 个志愿者协助当前采集员
if (j >= 3) {
dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - 3] + curEff + 2 * M);
}
//有 4 个志愿者协助当前采集员
if (j >= 4) {
dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - 3] + curEff + 3 * M);
}
}
}
System.out.println(dp[m][n]);
}
六、效果展示
1、输入
2 2
200 200
2、输出
400
🏆下一篇:华为OD机试真题 Python 实现【相对开音节】【2022Q4 100分】,附详细解题思路
🏆本文收录于,华为OD机试(Python)真题(A卷+B卷)
每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。