任务总执行时长

一、题目描述

任务编排服务负责对任务进行组合调度。参与编排的任务有两种类型,其中一种执行时长为taskA,另一种执行时长为taskB。任务一旦开始执行不能被打断,且任务可连续执行。服务每次可以编排num个任务。请编写一个方法,生成每次编排后的任务所有可能的总执行时长。

二、输入输出描述

输入描述

  • 第一行:三个整数 taskAtaskBnum(逗号分隔)。

备注:

  • taskA:第1种任务执行时长
  • taskB:第2种任务执行时长
  • num:编排的任务个数num
  • 0 < taskA 0 < taskB 0 <= num <= 100000
  • 每种任务的数量都大于本次可以编排的任务数量

输出描述

  • 每种任务的数量都大于本次可以编排的任务数量。

三、示例

|----|----------------|
| 输入 | 1,2,3 |
| 输出 | 3, 4, 5, 6 |
| 说明 | |

四、解题思路

  1. 核心思想

通过遍历所有可能的组合系数i,计算目标表达式的值,利用TreeSet的 "自动去重 + 升序排列" 特性,无需手动处理重复值和排序,直接得到有序且唯一的结果集合 ------ 核心是 "遍历枚举所有组合 + 有序集合简化后处理"。

  1. 问题本质分析
  • 表层问题:计算i从 0 到count时,tA*i + tB*(count-i)的所有可能值,要求去重并按升序输出;
  • 深层问题:
    1. 组合枚举:i的取值范围是 0 到count的整数,需覆盖所有可能的组合;
    2. 结果去重:不同i可能计算出相同值(如tA=tB时),需剔除重复;
    3. 结果排序:要求输出升序的结果,需对计算值排序;
    4. 边界处理:count=0时无有效计算结果,需返回空数组格式。
  1. 核心逻辑
  • 枚举所有可能:遍历i从 0 到count,计算每个i对应的表达式值,确保覆盖所有组合;
  • 容器特性复用:使用TreeSet存储计算值,利用其 "添加时自动去重、默认升序排列" 的特性,省去手动去重(如用HashSet后再排序)和排序的步骤;
  • 边界特殊处理:count=0时直接返回空数组格式,避免无效遍历。
  1. 步骤拆解

  2. 输入解析

    • 读取逗号分隔的输入字符串,分割并转换为tAtBcount三个整数。
  3. 边界判断

    • count=0,直接返回[],无需后续计算。
  4. 枚举计算 + 去重排序

    • 初始化TreeSet容器;
    • 遍历i从 0 到count,计算tA*i + tB*(count-i)并加入TreeSet(自动去重 + 升序)。
  5. 结果输出

    • 调用TreeSettoString()方法,直接输出有序、去重的结果字符串(格式为[值1, 值2, ...])。

五、代码实现

java 复制代码
import java.util.Set;
import java.util.TreeSet;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        
        // 读取输入并分割为 tA, tB 和 count
        String[] data = input.nextLine().split(",");
        int tA = Integer.parseInt(data[0]); // tA的值
        int tB = Integer.parseInt(data[1]); // tB的值
        int count = Integer.parseInt(data[2]); // count的值
        
        // 输出计算的结果
        System.out.println(calcTimes(tA, tB, count));
    }
    // 计算所有可能的时间值
    public static String calcTimes(int tA, int tB, int count) {
        // 如果 count 为 0,直接返回空数组表示没有结果
        if (count == 0) return "[]";
        // 使用 TreeSet 来自动去重并按升序排列
        Set<Integer> times = new TreeSet<>();
        
        // 计算 i 从 0 到 count 的所有可能的 tA * i + tB * (count - i)
        for (int i = 0; i <= count; i++) {
            times.add(tA * i + tB * (count - i));
        }
        // 返回 TreeSet 的字符串表示,即集合中的所有元素按升序排列
        return times.toString();
    }
}
相关推荐
不正经学生1 小时前
C语言预处理详解:编译器真正动手之前的那些事
c语言·开发语言·算法·面试·bug
毕竟是shy哥4 小时前
计算YOLO数据集中每个类的目标数
算法·yolo·机器学习
M78佐菲4 小时前
Linux学习笔记:TCP协议
linux·笔记·学习·tcp/ip·算法
lilian2334 小时前
HarmonyOS 7 新特性(二十五)|智慧手势:意图识别与误触治理
华为·harmonyos
学长毕业设计4 小时前
基于SpringBoot的公益基金管理系统(源码+文档+讲解视频)
java·spring boot·后端
东小西4 小时前
【SAA实战】第 3 篇 · 工具调用全攻略:把业务能力交给 Agent 自己调度
java·后端·spring
东小西4 小时前
【SAA实战】第 4 篇 · Agent 短期记忆:saver 让 Agent 跨轮记得住(threadId 隔离)
java·后端·spring
许彰午4 小时前
22-DataCenter报文序列化
java·低代码·架构·状态模式
2601_962065255 小时前
[MySQL] SQL优化之性能分析
java·sql·mysql
怕浪猫5 小时前
AI Agent 的安全围栏:DeepSeek Harness 沙箱隔离策略全解析
面试·agent·产品经理