题目
-
- 使用服务器处理任务
-
- 准时抵达会议现场的最小跳过休息次数
思路与算法
-
- 使用服务器处理任务:典型双堆问题,逻辑清晰即可写出代码,今天两题使用Java来写
-
- 准时抵达会议现场的最小跳过休息次数:不太经典的dp,注意动态转移方程的分析过程,代码中需要注意浮点运算不要超出范围。其余的正常书写即可。
代码实现
-
- 使用服务器处理任务
class Solution {
public int[] assignTasks(int[] servers, int[] tasks) {
PriorityQueue<int[]> allServer = new PriorityQueue<>(new Comparator<int[]>(){
@Override
public int compare(int [] o1, int [] o2) {
if(o1[2] != o2[2]) return o1[2] - o2[2];
else{
if(o1[1] != o2[1]) return o1[1] - o2[1];
else return o1[0] - o2[0];
}
}
});
PriorityQueue<int[]> freeServer = new PriorityQueue<>(new Comparator<int[]>(){
@Override
public int compare(int [] o1, int [] o2) {
if(o1[1] != o2[1]) return o1[1] - o2[1];
else return o1[0] - o2[0];
}
});
for(int i = 0; i < servers.length; i++)
allServer.add(new int[]{i, servers[i], 0});
int temp[];
int time = 0;
for(int i = 0; i < tasks.length; i++){
while(allServer.size() != 0 && allServer.peek()[2] <= time)
freeServer.add(allServer.poll());
if(freeServer.size() == 0){
temp = allServer.poll();
time = temp[2];
}
else
temp = freeServer.poll();
temp[2] = time + tasks[i];
allServer.add(temp);
tasks[i] = temp[0];
if(time <= i)
time++;
}
return tasks;
}
}
-
- 准时抵达会议现场的最小跳过休息次数
class Solution {
public int minSkips(int[] dist, int speed, int hoursBefore) {
int n=dist.length;
long[][] dp=new long[n+1][n+1];
for(int i=1;i<=n;i++){
for(int j=0;j<=n;j++){
dp[i][j]=Integer.MAX_VALUE;
}
}
for(int i=1;i<=n-1;i++){
for(int j=0;j<=n;j++){
if(j==0){
dp[i][j]=(dp[i-1][j]+dist[i-1]+speed-1)/speed*speed;
}else{
dp[i][j]=Math.min(dp[i-1][j-1]+dist[i-1],(dp[i-1][j]+dist[i-1]+speed-1)/speed*speed);
}
}
}
for(int i=0;i<=n;i++){
if((double)(dp[n-1][i]+dist[n-1])/(double)speed<=(double)hoursBefore)
return i;
}
return -1;
}
}
写在最后
- 鸿蒙是真滴nb!