华为OD 部门人力分配(java)

 题目描述:

部门在进行需求开发时需要进行人力安排。当前部门需要完成 N 个需求,需求用

requirements[i] 表示,requirements[i] 表示第 i 个需求的工作量大小,单位:人月。这部分需求需要在 M 个月内完成开发,进行人力安排后每个月的人力是固定的。

目前要求每个月最多有 2 个需求开发,并且每个月需要完成的需求不能超过部门人力。请帮部门评估在满足需求开发进度的情况下,每个月需要的最小人力是多少?

输入描述

输入第一行为 M ,第二行为 requirements ,长度为N。

M 表示需要开发时间要求,requirements 表示每个需求工作量大小

1 ≤ N / 2 ≤ M ≤ N ≤ 10000,1 ≤ requirements[i]≤ 10^9

输出描述

对于每一组测试数据,输出部门需要人力需求,行末无多余的空格。

示例1

输入

3

3 5 3 4

输出

6

说明

当选择人力为6时,2个需求量为3的工作可以在1个月里完成,其他2个工作各需要1个月完成。可以在3个月内完成所有需求。

当选择人力为5时,4个工作各需要1个月完成,一共需要4个月才能完成所有需求。

因此6是部门最小的人力需求。

代码

 

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int m = in.nextInt();
        in.nextLine();
        List<Integer> requirements=new ArrayList<>();
        String[] str = in.nextLine().split(" ");
        for (int i = 0; i < str.length; i++) {
            int t=Integer.parseInt(str[i]);
            requirements.add(t);
        }
        Collections.sort(requirements);
        Integer firstKey = requirements.get(0);
        Integer lastKey = requirements.get(requirements.size()-1);

        int beg=firstKey;
        int end=lastKey*2;
        int time=0;
        System.out.println(f(m,requirements,6));
        while (true){
            int cent=(beg+end)/2;
            int t=f(m,requirements,cent);
            if(t<=m){
                int temp=f(m,requirements,cent-1);
                if(temp>m){
                    time=cent;
                    break;
                }else{
                    end=cent;
                }
            }else{
                beg=cent;
            }
        }
        System.out.println(time);
    }

    private static int f(int m, List<Integer> requirements, int index) {
        List<Integer> rs=new ArrayList<>(requirements);
        int time=0;
        int dex=index;
        for (int i = 0; i < rs.size(); ) {
            int t=rs.get(i);
            if(t<dex){
                int temp=0;
                int k=i;
                for (int j = k; j < rs.size() ; j++) {
                    temp+=rs.get(j);
                    if(temp>dex){
                        break;
                    }
                    i++;
                }

                time++;
            } else if (t==dex) {
                time++;
                i++;
            }else{
                if(t%dex==0){
                    time+=t/dex;
                }else{
                    time+=t/dex+1;
                }
                i++;
            }
        }
        return time;
    }
}

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LJY码云

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值