完成工作所需人数问题
近期,学校拟定举办手办大赛,每个班需要派出一定数目的学生进行参赛,已知有若干名同学参加,但是所需的时间不一样,假设知道每个学生的耗时情况,学生的开始时间(绝对秒)和耗时(单位:秒)。为了保证手办能够完成,需要让老师计算出能完成这项任务所需的人数。
输入:
4
1689814800 1800
1689815100 300
1689816600 300
1689815220 150
思路分析
首先按照计划开始时间从小到大排序,获得每个学生的完成时间及耗时,然后计算每一步所需学生的预计人数及完成总量,以计算新增的人数符合手办比赛的要求。
源码分析
import java.util.Arrays;
import java.util.Comparator;
public class Tasks {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[][] tasks = new int[n][2];
for (int i = 0; i < n; i++) {
tasks[i][0] = scanner.nextInt();
tasks[i][1] = scanner.nextInt();
}
int result = studentsNeed(tasks);
System.out.println("所需学生的数量为: " + result);
}
public static int studentsNeed(int[][] tasks) {
int n = tasks.length;
Arrays.sort(tasks, Comparator.comparingInt(a -> a[0]));
int[] students = new int[n];
int studentsNeed = 0;
for (int i = 0; i < n; i++) {
boolean assigned = false;
for (int j = 0; j < studentsNeed; j++) {
if (tasks[i][0] >= students[j]) {
students[j] = tasks[i][0] + tasks[i][1];
assigned = true;
break;
}
}
//如果当前人数不能够满足任务完成的要求
if (!assigned) {
students[studentsNeed] = tasks[i][0] + tasks[i][1];
studentsNeed++;
}
}
return studentsNeed;
}
}