华为OD机考算法题:流水线

news/2024/7/20 19:12:27 标签: 华为od, 算法, 数据结构, Java, Javascript

题目部分

题目流水线
难度
题目说明一个工厂有 m 条流水线,来并行完成 n 个独立的作业,该工厂设置了一个调度系统,在安排作业时,总是优先执行处理时间最短的作业。
现给定流水线个数 m,需要完成的作业数 n,每个作业的处理时间分别为 t1,t2...tn。 请你编程计算处理完所有作业的耗时为多少?
当 n > m 时,首先处理时间短的 m 个作业进入流水线,其他的等待,当某个作业完成时,依次从剩余作业中取处理时间最短的进入处理。
输入描述第一行为 2 个整数(采取空格分隔),分别表示流水线个数 m 和作业数 n;
第二行输入 n 个整数(采取空格分隔),表示每个作业的处理时长 t1, t2...tn;
0 < m, n < 100;
0 < t1, t2...tn < 100。
输出描述输出完成所有作业的总时长。
补充说明
------------------------------------------------------
示例
示例1
输入3 5
8 4 3 2 10
输出13
说明1. 先安排 2、3、4 的 3 个作业;
2. 第一条流水线先完成作业,然后调度剩余时间最短的作业 8;
3. 第二条流水线完成作业,然后调度剩余时间最短的作业 10;
4. 总耗时就是第二条流水线完成作业的时间 13 (3 + 10 = 13)。


解读与分析

题目解读

把所有的作业按照从小到的顺序排序,依次放到流水线中。当某个流水线完成,从作业的队列中拿出下一个,放到流水线中。求最终所有作业完成的时间。

分析与思路

此题先对作业从小到大排序。
当流水线数大于作业数,则输入作业中最大的值。
当流水线数小于作业数,
1. 设作业时间为 sum,初始值为 0。将排序好的作业依次放到流水线中。
2. 计算流水线中最小值,设为 min,赋值 sum += min,并把流水中的所有作业都减去 min,然后把下一个作业放到值为 0 流水线中,循环,直到最后一个作业放到流水线中。
3. 最后一次的时间为流水线中的最大值(设为max),并 sum += max。输出 sum。

时间复杂度和空间复杂度均为 O(n)。


代码实现

Java代码

import java.util.Arrays;
import java.util.Scanner;

/**
 * 流水线
 * 
 * @since 2023.10.25
 * @version 0.1
 * @author Frank
 *
 */
public class Pipeline {
    public static void main(String[] args) {
	Scanner sc = new Scanner(System.in);
	while (sc.hasNext()) {
	    String input = sc.nextLine();
	    String[] inputStr = input.split(" ");

	    int m = Integer.parseInt(inputStr[0]);
	    int n = Integer.parseInt(inputStr[1]);

	    int[] workInfo = new int[n];
	    input = sc.nextLine();
	    inputStr = input.split(" ");
	    for (int i = 0; i < n; i++) {
		workInfo[i] = Integer.parseInt(inputStr[i]);
	    }
	    processPipeline(m, n, workInfo);
	}
    }

    private static void processPipeline(int m, int n, int[] workInfo) {
	Arrays.sort(workInfo);
	if (m >= n) {
	    System.out.println(workInfo[n - 1]);
	    return;
	}
	int[] pipeline = new int[m];
	int sum = workInfo[0];

	int minIndex = 0;
	int Value2Minus = workInfo[0];
	for (int i = 0; i < m; i++) {
	    pipeline[i] = workInfo[i] - Value2Minus;
	}

	int workIndex = m;
	while (workIndex <= n - 1) {
	    pipeline[minIndex] = workInfo[workIndex];
	    if (workIndex == n - 1) {
		sum += pipeline[getMaxPipepline(pipeline)];
		break;
	    } else {
		minIndex = getMinPipepline(pipeline);
		Value2Minus = pipeline[minIndex];
		sum += Value2Minus;
		for (int i = 0; i < m; i++) {
		    pipeline[i] -= Value2Minus;
		}
	    }

	    workIndex++;
	}
	System.out.println(sum);
    }

    private static int getMinPipepline(int[] pipeline) {
	int index = 0;
	int min = pipeline[0];
	for (int i = 0; i < pipeline.length; i++) {
	    if (pipeline[i] < min) {
		index = i;
		min = pipeline[i];
	    }
	}
	return index;
    }

    private static int getMaxPipepline(int[] pipeline) {
	int index = 0;
	int max = pipeline[0];
	for (int i = 0; i < pipeline.length; i++) {
	    if (pipeline[i] > max) {
		index = i;
		max = pipeline[i];
	    }
	}
	return index;
    }
}

JavaScript代码

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void async function() {
    while (line = await readline()) {
        var inputArr = line.split(" ");

        var m = parseInt(inputArr[0]);
        var n = parseInt(inputArr[1]);

        var workInfo = new Array();
        line = await readline();
        var inputStr = line.split(" ");
        for (var i = 0; i < n; i++) {
            workInfo[i] = parseInt(inputStr[i]);
        }
        processPipeline(m, n, workInfo);
    }
}();

function processPipeline(m, n, workInfo) {
    workInfo.sort(function compareFn(a, b) {
        return a - b;
    });
    console.log( workInfo );
    if (m >= n) {
        console.log(workInfo[n - 1]);
        return;
    }
    var pipeline = new Array();
    var sum = workInfo[0];

    var minIndex = 0;
    var value2Minus = workInfo[0];
    for (var i = 0; i < m; i++) {
        pipeline[i] = workInfo[i] - value2Minus;
    }
    console.log( pipeline );
    var workIndex = m;
    while (workIndex <= n - 1) {
        pipeline[minIndex] = workInfo[workIndex];
        if (workIndex == n - 1) {
            sum += pipeline[getMaxPipepline(pipeline)];
            break;
        } else {
            minIndex = getMinPipepline(pipeline);
            value2Minus = pipeline[minIndex];
            sum += value2Minus;
            for (var i = 0; i < m; i++) {
                pipeline[i] -= value2Minus;
            }
            console.log( pipeline );
        }

        workIndex++;
    }
    console.log(sum);
}

function getMinPipepline(pipeline) {
    var index = 0;
    var min = pipeline[0];
    for (var i = 0; i < pipeline.length; i++) {
        if (pipeline[i] < min) {
            index = i;
            min = pipeline[i];
        }
    }
    return index;
}

function getMaxPipepline(pipeline) {
    var index = 0;
    var max = pipeline[0];
    for (var i = 0; i < pipeline.length; i++) {
        if (pipeline[i] > max) {
            index = i;
            max = pipeline[i];
        }
    }
    return index;
}

(完)


http://www.niftyadmin.cn/n/5123997.html

相关文章

python常用pip安装源网址

平时pip安装偶尔会下载速度过慢 可以使用以下网站进行下载 豆瓣:http://pypi.douban.com/simple/ 清华大学:https://pypi.tuna.tsinghua.edu.cn/simple/ 中国科技大学:https://pypi.mirrors.ustc.edu.cn/simple/ 阿里云:https://mirrors.aliyun.com/pypi/simple/ 百度&#x…

java--while循环

1.while循环 2.示例 3.执行的流程&#xff1a; ①循环一开始&#xff0c;执行int i 0一次 ②此时 i0&#xff0c;接着计算机执行循环条件语句&#xff1a;0 < 3 返回true&#xff0c;计算机就进到循环体中执行&#xff0c;输出&#xff1a;"Hello World",然后执…

Linux: sysctl: rp_filter; 包到了内核,没有到socket,火星包martia

文章目录 rp_filter INTEGERsystemd -rhel7firewalld-0.6.3-11.el7.noarch相关的coderp_filter INTEGER 0 - No source validation. 1 - Strict mode as defined in RFC3704 Strict Reverse Path Each incoming packet is tested against the FIB and if the interface is not…

NOIP2023模拟3联测24-博弈树

Alice \text{Alice} Alice 和 Bob \text{Bob} Bob 又开始玩游戏了&#xff0c;他们已经把石子堆得比山还高了&#xff0c;现在他们要玩一种更新奇的游戏&#xff0c;这种游戏的规则如下&#xff1a; 给定一颗 n n n 个节点的树&#xff0c; Alice \text{Alice} Alice 和 Bo…

CVE-2021-21234 spring-boot-actuator-logview目录遍历漏洞

0x01 影响版本 Spring-Boot-Actuator-logview < 0.2.13 0x02 漏洞分析 源码中对filename进行了校验但并未对路径进行校验 校验函数如下&#xff1a; 0x03 漏洞复现 首先开vulhub的镜像 点击下载&#xff0c;原数据包如下 送入repeater打入payload&#xff0c;复现…

大数据之LibrA数据库常见术语(六)

客户端 连接或请求其它计算机或程序服务的计算机或程序。 空闲空间管理 管理表内空闲空间的机制&#xff0c;通过记录每个表内空闲空间信息&#xff0c;并建立易于查找的数据结构&#xff0c;可以加速对空闲空间进行的操作&#xff08;例如INSERT&#xff09;。 LLVM LLVM命…

ETO制造商目前面临的六大挑战,如何应对?

与离散制造、库存制造不同&#xff0c;按订单设计制造&#xff08;ETO&#xff09;行业面临着一系列独特的挑战。从复杂的产品设计到与客户的密切联系&#xff0c;按订单生产的每件产品都不尽相同。 如果采用按订单生产方式制造产品&#xff0c;管理者总是会想方设法采购最好的…

如何在宝塔面板安装配置MySQL数据库并实现公网访问

宝塔安装MySQL数据库&#xff0c;并内网穿透实现公网远程访问 文章目录 宝塔安装MySQL数据库&#xff0c;并内网穿透实现公网远程访问前言1.Mysql服务安装2.创建数据库3.安装cpolar3.2 创建HTTP隧道 4.远程连接5.固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网…