完成一项工作耗时问题分析

完成工作所需人数问题

近期,学校拟定举办手办大赛,每个班需要派出一定数目的学生进行参赛,已知有若干名同学参加,但是所需的时间不一样,假设知道每个学生的耗时情况,学生的开始时间(绝对秒)和耗时(单位:秒)。为了保证手办能够完成,需要让老师计算出能完成这项任务所需的人数。

输入:
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;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值