当前有n个水池(n无大小限制,此处0<n<10^5)可同时蓄水,蓄满第i个水池所需要的时间为time[i],蓄第i个水池所需要的工人数为costs[i],(水池一旦开始蓄水就不能停下,且对水池蓄水必须满足人数要求,time.length = costs.length),当前有x个员工在待命(单个水池需要的人数不会超过x),求在满足人数要求的情况下完成全部蓄水任务的最短时间。
输入:
time = [2,4,10]
costs = [2,5,7]
x=7
输出:14
当前有n个水池(n无大小限制,此处0<n<10^5)可同时蓄水,蓄满第i个水池所需要的时间为time[i],蓄第i个水池所需要的工人数为costs[i],(水池一旦开始蓄水就不能停下,且对水池蓄水必须满足人数要求,time.length = costs.length),当前有x个员工在待命(单个水池需要的人数不会超过x),求在满足人数要求的情况下完成全部蓄水任务的最短时间。
输入:
time = [2,4,10]
costs = [2,5,7]
x=7
输出:14
public static int minTime(int[] time,int[] costs,int x){
int temp,times=0,tmp_x=x;
if(time.length==0 || costs.length==0){
return times;
}
// 按时间排序
for(int i=1;i<time.length;i++){
for(int j=0;j<time.length-i;j++){
if(time[j]<time[j+1]){
temp=time[j];
time[j]=time[j+1];
time[j+1]=temp;
temp=costs[j];
costs[j]=costs[j+1];
costs[j+1]=temp;
}
}
}
// 复制一个临时数组,用于删除使用过的元素
int[] tmp_time=(int[]) Arrays.copyOf(time,time.length);
int[] tmp_costs=(int[]) Arrays.copyOf(costs,costs.length);
int len=tmp_costs.length;
// 开始获取时间
for(int i=0;i<costs.length;i++){
// 判断人数是否满足条件
if(tmp_x>=costs[i]){
// 每一次统计只取同时进行所花最大时间
if(times<time[i]){
times=time[i];
}
tmp_x-=costs[i];
// 删除使用过的元素
for(int k=i;k<len-1;k++){
tmp_costs[k]=tmp_costs[k+1];
tmp_time[k]=tmp_time[k+1];
}
tmp_costs[len-1]='\0';
tmp_time[len-1]='\0';
len--;
}
if(tmp_x==0){ break; }
}
return times+minTime((int[]) Arrays.copyOf(tmp_time,len),(int[]) Arrays.copyOf(tmp_costs,len),x);
}