题目描述
在系统、网络均正常的情况下组织核酸采样员和志愿者对人群进行核酸检测筛查。
每名采样员的效率不同,采样效率为N人/小时。
由于外界变化,采样员的效率会以M人/小时为粒度发生变化,M为采样效率浮动粒度,M=N*10%,输入保证N*10%的结果为整数。
采样员效率浮动规则:采样员需要一名志愿者协助组织才能发挥正常效率,在此基础上,每增加一名志愿者,效率提升1M,最多提升3M;
如果没有志愿者协助组织,效率下降2M。
怎么安排速度最快?求总最快检测效率(总检查效率为各采样人员效率值相加)
输入描述
第一行一个值,采样员人数,取值范围[1,100];
第二个值,志愿者人数,取值范围[1,500];
第二行:各采样员基准效率值(单位人/小时),取值范围[60,600],保证序列中每项值计算10%为整数。
输出描述
第一行:总最快检测效率(单位人/小时)
案列
输入:
2 2
200 300
输出:
500
输入:
2 2
60 600
输出:
708
输入:
2 2
60 100
输出:
160
输入:
3 15
100 200 300
输出:
780
输入:
3 9
100 200 300
输出:
750
代码:
import java.util.Scanner;
public class ceshi2023_3_15 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int[] count = new int[n];
for(int i=0;i<n;i++){
count[i] = sc.nextInt();
}
// dp[i][j][k]表示到第i个采样员,已经分配了j个志愿者,且最后一个采样员分配了
// k个志愿者,所得到的最快检测效率
int[][][] dp = new int[n][m+1][5];
int res = 0;
for(int i=0;i<n;i++){
for(int j=0;j<m+1;j++){
for(int k=0;k<=Math.min(4,j);k++){
if(i==0){
if(k==0){
dp[i][j][k] = (int) (count[i]*0.8);
}else{
dp[i][j][k] = (int) (count[i]*(1+0.1*(k-1)));
}
}else{
int val = -1;
// 取其中的最大值,关于上一个(i-1)采样员使用了多少个志愿者
// 对于当前采样员(i)来说,并不关心,他只关心到上一个为止,一共使用了
// 多少个志愿者
for(int t=0;t<5;t++){
val = Math.max(val,dp[i-1][j-k][t]);
}
if(k==0){
dp[i][j][k] = (int) (val + count[i]*0.8);
}else{
dp[i][j][k] = (int) (val+count[i]*(1+0.1*(k-1)));
}
}
res = Math.max(res,dp[i][j][k]);
}
}
}
System.out.println(res);
}
}