【头条笔试T2】
发布日期:2021-05-28 16:52:36 浏览次数:36 分类:精选文章

本文共 1913 字,大约阅读时间需要 6 分钟。

为了解决这个问题,我们需要计算两个关键指标:所有文件被传输完的时刻,以及在传输过程中队列中文件堆积的最大数量。

方法思路

  • 输入处理:首先读取输入数据,包括每一批文件的到达时间和数量。然后将这些数据按照到达时间从小到大排序,以便我们可以按时间顺序处理每一批文件。
  • 模拟传输过程:我们需要跟踪当前队列中的文件数量,以及队列中文件堆积的最大数量。对于每一批文件,计算它到达时队列中已经处理的情况:
    • 如果当前文件到达时间足够早,队列中的文件都能被处理完,此时新文件直接加入队列。
    • 否则,新文件会排在队列后面,导致队列中的文件数量增加。
  • 计算完成时间:完成时间是最后一个文件到达时间再加上处理完它们所需的时间。
  • 解决代码

    import java.util.Comparator;import java.util.Vector;public class Solution {    public static void main(String[] args) {        int n = Integer.parseInt(args[0]);        Vector
    vec_file = new Vector<>(); for (int i = 1; i < n; i++) { int t = Integer.parseInt(args[i]); int c = Integer.parseInt(args[i + 1]); vec_file.add(new FileInfo(t, c)); } vec_file.sort((a, b) -> a.time - b.time); long timeLast = vec_file.get(0).time; long haveNum = vec_file.get(0).c; long maxNum = haveNum; long timeCurrent = timeLast; for (int i = 1; i < n; i++) { long currentTime = vec_file.get(i).time; long diffTime = currentTime - timeLast; if (diffTime >= haveNum) { haveNum = vec_file.get(i).c; } else { haveNum = (haveNum - diffTime) + vec_file.get(i).c; } if (haveNum > maxNum) { maxNum = haveNum; } timeLast = currentTime; timeCurrent += haveNum; } long finishTime = timeCurrent; System.out.println(finishTime + " " + maxNum); } static class FileInfo { int time; int c; FileInfo(int t, int c) { this.time = t; this.c = c; } }}

    代码解释

  • 读取输入:读取输入的文件数n和每个文件的到达时间和数量。
  • 排序文件信息:按到达时间从小到大排序,确保我们可以依次处理每个文件。
  • 初始化变量:记录当前队列中的文件数量haveNum和最大队列数量maxNum,以及当前时间timeLast
  • 处理每一批文件:遍历每一批文件,计算时间差,判断是否需要更新队列数量,并检查最大值。
  • 计算完成时间:最后一个文件到达时间加上有有处理时间就是完成时间。
  • 输出结果:打印完成时间和最大队列数量。
  • 该方法确保了按时处理每一批文件,并正确计算出传输完成时间和队列最大数量,能够在较大的数据范围内高效运行。

    上一篇:使用hexo搭建博客,文件无法加载的问题
    下一篇:关于C++内置排序函数sort的自定义比较器cmp用法

    发表评论

    最新留言

    感谢大佬
    [***.8.128.20]2025年05月06日 08时44分41秒