华为OD机考算法题:高效的任务规划

news2024/12/24 2:17:11

题目部分

题目高效的任务规划
难度
题目说明

你有 n 台机器编号为 1 ~ n,每台都需要完成一项工作, 机器经过配置后都能独立完成一项工作。 假设第 台机器你需要花 B_{i} 分钟进行设置, 然后开始运行, J_{i} 分钟后完成任务。 现在,你需要选择布置工作的顺序,使得用最短的时间完成所有工作。 注意,不能同时对两台进行配置, 但配置完成的机器们可以同时执行他们各自的工作。

输入描述第一行输入代表总共有 M 组任务数据(1 < M <= 10)。
每组数第一行为一个整数指定机器的数量 N (0 < N <= 1000)。 随后的 N 行每行两个整数,第一个表示 B (0 <= B <= 10000), 第二个表示 J (0 <= J <= 10000)。
每组数据连续输入,不会用空行分割,各组任务单独计时。
输出描述对于每组任务,输出最短完成时间, 且每组的结果独占一行。 例如两组任务就应该有两行输出。
补充说明
------------------------------------------------------
示例
示例1
输入1
1
2 2
输出4
说明输出共 3 行数据,第 1 行代表只有 1 组数据;第 2 行代表本组任务只有 1 台机器;第 3 行代表本机器:配置需要 2 分钟,执行需要 2 分钟。输出 1 行数据,代表执行结果为 4 分钟。 
示例2
输入2
2
1 1
2 2
3
1 1
2 2
3 3 
输出4
7
说明第一行代表输入共 2 组数据, 2 - 4 行代表第一组数据,为 2 台机器的配置、执行信息(第 1 台机器:配置需要 1 分钟,执行需要 1 分钟;第 2 台机器:配置需要 2 分钟,执行需要 2 分钟)。5 - 8 行代表第二组数据,为 3 台机器的配置、执行信息(意义同上)。输出共 2 行,分别代表第 1 组任务共需要 4 分钟和第 2 组任务需要 7 分钟(先配置 3,在配置 2,最后配置 1,执行 1 分钟,共 7 分钟)。


解读与分析

题目解读

每台机器只有配置了才能执行。而在同一个时间段只能执行一台机器的配置(配置串行执行),在配置完成后,任务即可执行。
求出执行完所有任务的时间。

分析与思路

对于每一组数据,可以采取贪心算法,遍历所有的组合情况,求出每种情况所需要的时间,经比较,输出时间最小的数字。

此算法的时间复杂度为 O(n^{2}),空间复杂度为  O(n^{2})。


代码实现

Java代码

import java.util.Scanner;

/**
 * 高效的任务规划
 * 
 * @since 2023.10.25
 * @version 0.1
 * @author Frank
 *
 */
public class EfficientTaskPlan {
    public static void main(String[] args) {
	Scanner sc = new Scanner(System.in);
	while (sc.hasNext()) {
	    String input = sc.nextLine();
	    int groupCnt = Integer.parseInt(input);
	    int[] outputValues = new int[ groupCnt ];
	    for( int i = 0; i < groupCnt; i ++ )
	    {
		input = sc.nextLine();
		int machineCnt = Integer.parseInt( input );
		int [][] taskInfo = new int[machineCnt][2];
		for( int j = 0; j < machineCnt; j ++ )
		{
		    input = sc.nextLine();
		    String[] eachMachineStr = input.split( " " );
		    int[] eachMachine = new int[2];
		    eachMachine[0] = Integer.parseInt( eachMachineStr[0] );
		    eachMachine[1] = Integer.parseInt( eachMachineStr[1] );
		    taskInfo[j] = eachMachine;
		}
		int[] usedFlag = new int[taskInfo.length];
		for( int j = 0; j < usedFlag.length; j ++ )
		{
		    usedFlag[j] = 0;
		}
		outputValues[i] = caculateEachGroupTaskPlan( usedFlag, taskInfo, 0 );
	    }

	    for( int i = 0; i < groupCnt; i ++ )
	    {
		System.out.println( outputValues[i] );
	    }
	}
    }

    private static int caculateEachGroupTaskPlan( int[] usedFlag, int [][] taskInfo, int curTask ) {
	int minTimeTake = Integer.MAX_VALUE;
	for( int i = 0; i < taskInfo.length; i ++ )
	{
	    if( usedFlag[i] == 1 )
	    {
		continue;
	    }
	    
	    int tmpConfig = taskInfo[i][0];
	    int tmpTask = taskInfo[i][1];
	    
	    usedFlag[i] = 1;
	    int curTimeTake = tmpConfig + caculateEachGroupTaskPlan( usedFlag, taskInfo, tmpTask );
	    usedFlag[i] = 0;
	    if( curTimeTake <= curTask )
	    {
		return curTask;
	    }
	    if( curTimeTake < minTimeTake )
	    {
		minTimeTake = curTimeTake;
	    }
	    
	}	
	if( minTimeTake < curTask || minTimeTake == Integer.MAX_VALUE )
	{
	    minTimeTake = curTask;
	}
	return minTimeTake;
    }
}

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 groupCnt = parseInt(line);
        var outputValues = new Array();
        for (var i = 0; i < groupCnt; i++) {
            line = await readline();
            var machineCnt = parseInt(line);
            var taskInfo = new Array();
            for (var j = 0; j < machineCnt; j++) {
                line = await readline();
                var eachMachineStr = line.split(" ");
                var eachMachine = new Array();
                eachMachine[0] = parseInt(eachMachineStr[0]);
                eachMachine[1] = parseInt(eachMachineStr[1]);
                taskInfo[j] = eachMachine;
            }
            var usedFlag = new Array();
            for (var j = 0; j < groupCnt; j++) {
                usedFlag[j] = 0;
            }
            outputValues[i] = caculateEachGroupTaskPlan(usedFlag, taskInfo, 0);
        }

        for (var i = 0; i < groupCnt; i++) {
            console.log(outputValues[i]);
        }

    }
}();

function caculateEachGroupTaskPlan(usedFlag, taskInfo, curTask) {
    var minTimeTake = Number.MAX_VALUE;
    for (var i = 0; i < taskInfo.length; i++) {
        if (usedFlag[i] == 1) {
            continue;
        }

        var tmpConfig = taskInfo[i][0];
        var tmpTask = taskInfo[i][1];

        usedFlag[i] = 1;
        var curTimeTake = tmpConfig + caculateEachGroupTaskPlan(usedFlag, taskInfo, tmpTask);
        usedFlag[i] = 0;
        if (curTimeTake <= curTask) {
            return curTask;
        }
        if (curTimeTake < minTimeTake) {
            minTimeTake = curTimeTake;
        }

    }
    if (minTimeTake < curTask || minTimeTake == Number.MAX_VALUE) {
        minTimeTake = curTask;
    }
    return minTimeTake;
}

(完)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1135850.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

虹科培训 | 虹科携手PLCopen开展IEC 61131-3国际工程师培训

文章来源&#xff1a;虹科工业控制 阅读原文&#xff1a;https://mp.weixin.qq.com/s/MLYhBWiWx7qQSApx_3xhmA &#xff08;一&#xff09;课程背景 什么是IEC 61131-3&#xff1f; IEC 61131-3 是工业自动化行业唯一得到大量应用的组态编程语言国际标准&#xff1b;主导制定…

安卓端GB28181设备接入模块如何实现实时位置订阅(MobilePosition)

技术背景 实时位置&#xff08;MobilePosition&#xff09;订阅和上报&#xff0c;对GB28281设备接入终端尤其重要&#xff0c;如移动单兵设备、执法记录仪、智能安全帽、车载终端等&#xff0c;Android国标接入设备通过获取到实时经纬度信息&#xff0c;按照一定的间隔上报到…

引入二维码技术,易点易动全员盘点方案助力高效海量资产盘点

固定资产是企业重要的财务资源之一&#xff0c;而高效准确地进行海量固定资产盘点一直是企业管理的重要挑战。为了解决盘点过程中的繁琐和错误问题&#xff0c;易点易动固定资产管理系统引入了先进的二维码技术&#xff0c;并采用全员盘点方案。本文将详细介绍易点易动固定资产…

单目3D目标检测[基于深度辅助篇]

基于深度辅助的方法 1. Pseudo-LiDAR Pseudo-LiDAR from Visual Depth Estimation: Bridging the Gap in 3D Object Detection for Autonomous Driving康奈尔大学https://zhuanlan.zhihu.com/p/52803631 首先利用DRON或PSMNET从单目 (Monocular)或双目 (Stereo)图像获取对应的…

海外公司注册推广的9个实用技巧建议-华媒舍

在全球化的时代背景下&#xff0c;海外市场的开发对于企业来说是非常重要的战略决策。海外公司注册是进入海外市场的第一步&#xff0c;通过注册在海外的公司&#xff0c;企业可以获得更多的商业机会和巨大的价值。本篇文章将为您介绍海外公司注册推广的9个实用建议&#xff0c…

干洗店预约下单管理系统收衣开单拍照必备软件

随着生活水平的提高和节奏的加快&#xff0c;商务人士的衣物越来越多&#xff0c;但精力和时间却越来越少。于是&#xff0c;干洗店应运而生&#xff0c;在中国&#xff0c;几乎所有的中心城市干洗店都门庭若市。若每人每月需要干洗一套服装&#xff0c;一个城市每月则需干洗50…

Postgresql在jdbc处理bit字段的解决方案

问题&#xff1a; bit如果长度为1&#xff0c;则会默认为布尔型&#xff08;1-true 0-false&#xff09;&#xff1b; bit如果长度大于1&#xff0c;则会默认为bit类型&#xff0c;但是代码中以前常用的两种set方式&#xff0c;会报错 第一种方式&#xff1a; ps.setObject(i1,…

vm_flutter

附件地址 https://buuoj.cn/match/matches/195/challenges#vm_flutter 可以在buu下载到。 flutter我也不会&#xff0c;只是这个题目加密算法全部在java层&#xff0c;其实就是一个异或和相加。 反编译 package k;import java.util.Stack;/* loaded from: classes.dex */ pu…

传智教育研究院重磅发布Java学科新研发《智慧养老》项目

在招聘Java开发人才的过程中&#xff0c;企业往往对候选人的项目经验有着严格的要求&#xff0c;项目经验成为顺利就业的重要敲门砖之一。而在数字化技术的学习中&#xff0c;如何让学员通过项目课程有效地积累实战开发经验&#xff0c;就成了数字化技术职业教育的一个重大难点…

EasyRecovery2024破解版数据恢复软件下载

当我们处理重要的文件数据时&#xff0c;遇到突然停电导致数据来不及保存&#xff0c;再次打开电脑后&#xff0c;此前处理的数据可能丢失&#xff0c;这无疑会影响我们的工作进度&#xff0c;数据恢复软件在此时就派上用场&#xff0c;那么下面就来具体介绍EasyRecovery软件的…

EasyRecovery2024破解版激活码

当我们处理重要的文件数据时&#xff0c;遇到突然停电导致数据来不及保存&#xff0c;再次打开电脑后&#xff0c;此前处理的数据可能丢失&#xff0c;这无疑会影响我们的工作进度&#xff0c;数据恢复软件在此时就派上用场&#xff0c;那么下面就来具体介绍EasyRecovery软件的…

5G与医疗:开启医疗技术的新篇章

5G与医疗&#xff1a;开启医疗技术的新篇章 随着5G技术的快速发展和普及&#xff0c;它已经在医疗领域产生了深远的影响。5G技术为医疗行业提供了更高效、更准确、更及时的通信方式&#xff0c;从而改变了医疗服务的模式和患者的体验。本文将探讨5G技术在医疗领域的应用场景、优…

10月《中国数据库行业分析报告》已发布,深度剖析甲骨文大会Oracle技术新趋势

为了帮助大家及时了解中国数据库行业发展现状、梳理当前数据库市场环境和产品生态等情况&#xff0c;从2022年4月起&#xff0c;墨天轮社区行业分析研究团队出品将持续每月为大家推出最新《中国数据库行业分析报告》&#xff0c;持续传播数据技术知识、努力促进技术创新与行业生…

k8s快速部署nacos2.2.0集群

nacos2.2.0集群部署。nacos-headless内部集群端口服务&#xff0c;nacos-service为了方便ingress转发提供给用户web界面操作&#xff0c;requiredDuringSchedulingIgnoredDuringExecution强制反亲和禁止同一个节点部署nacos实列。 1、数据库导入nacos的sql # 创建数据库 crea…

一文详解多模态大模型发展及高频因子计算加速GPU算力 | 英伟达显卡被限,华为如何力挽狂澜?

★深度学习、机器学习、多模态大模型、深度神经网络、高频因子计算、GPT-4、预训练语言模型、Transformer、ChatGPT、GenAI、L40S、A100、H100、A800、H800、华为、GPU、CPU、英伟达、NVIDIA、卷积神经网络、Stable Diffusion、Midjourney、Faster R-CNN、CNN 随着人工智能技术…

Java 音频处理,音频流转音频文件,获取音频播放时长

1.背景 最近对接了一款智能手表&#xff0c;手环&#xff0c;可以应用与老人与儿童监控&#xff0c;环卫工人监控&#xff0c;农场畜牧业监控&#xff0c;宠物监控等&#xff0c;其中用到了音频传输&#xff0c;通过平台下发语音包&#xff0c;发送远程命令录制当前设备音频并…

新手入门?初登开发者舞台的你所适合的三大开发工具?

对新手开发者来说&#xff0c;工具的简洁性和实用性和自己的产出直接挂钩&#xff0c;一个好用的工具往往会让编译代码减少很多麻烦&#xff0c;有哪些比较适合的工具&#xff0c;几乎成了每个新人必定会问的问题之一。 针对这些疑惑&#xff0c;今天就来讲讲三大新手型开发工…

CQ 社区版 V2.5.0 发布 | 开放在线试用、自定义高危操作、新增数据源Phoenix、Trino等

HELLO&#xff0c;大家好啊~ 很高兴又到每月发版时间&#xff01; 本月发布 CloudQuery 2.x 系列的第六个版本。V2.5.0 从多个模块进行了功能完善和优化&#xff0c;具体内容我们一起往下看&#xff01; 本次更新快览&#xff1a; 新增数据源&#xff1a;Phoenix、Trino新增…

Prometheus+Grafana+NodeExporter:构建出色的Linux监控解决方案,让你的运维更轻松

《PrometheusGrafanaNodeExporter&#xff1a;构建出色的Linux监控解决方案&#xff0c;让你的运维更轻松》 一、概述 本文使用PrometheusGrafanaNode Exporter搭建Linux主机监控系统&#xff1a; Prometheus 是一个监控系统&#xff0c;可以收集和存储来自各个目标的指标数…

strerror和perror

文章目录 strerrorperror strerror 当一个函数运行错误时&#xff0c;它会将对应的错误码存放在一个int类型的全局变量errno中&#xff0c;strerror函数是将错误码转化成错误信息的函数&#xff0c;参数是一个int类型的errno错误码&#xff0c;返回值为错误信息的首地址。 #in…