C++ 改进调度算法的运行时间

C++ 改进调度算法的运行时间,c++,algorithm,C++,Algorithm,假设一个开关需要a分钟打开一盏灯,并且它打开了b分钟。其目的是在至少1分钟内打开指示灯,并打印指示灯的打开顺序,否则应打印-1 假设我有如下输入: 2 1 5 5 10 第一行是1我能想到的最短解决方案是: 计算打开所有灯所需的总时间(T) 对于每个开关,计算您可以打开它的最早时间点t_i,使灯在t+1时仍亮起 根据该标准对开关进行排序 非对称复杂性由排序控制,因此最终将得到O(n(log(n))) 根据数字的大小,你可以用空间换取时间,并通过每分钟分配一个带有一个元素的向量,并直接将每个开

假设一个开关需要
a
分钟打开一盏灯,并且它打开了
b
分钟。其目的是在至少1分钟内打开指示灯,并打印指示灯的打开顺序,否则应打印
-1

假设我有如下输入:

2
1 5
5 10

  • 第一行是1我能想到的最短解决方案是:

  • 计算打开所有灯所需的总时间(T)
  • 对于每个开关,计算您可以打开它的最早时间点t_i,使灯在t+1时仍亮起
  • 根据该标准对开关进行排序
  • 非对称复杂性由排序控制,因此最终将得到O(n(log(n)))

    根据数字的大小,你可以用空间换取时间,并通过每分钟分配一个带有一个元素的向量,并直接将每个开关放置在向量中的t_i位置,将其转化为一个具有铠装线性复杂度(可能具有高常数)的算法。实际上,您正在创建一个非常稀疏的哈希表


    最后,您可以动态地调整粒度,但除非您有非常严格的时间和空间限制,否则我认为这是不必要的。

    打开灯需要多少程序员…真的,请做一些背景研究,并提及这到底是什么标准算法或问题。老实说,我不知道。这是一个排序问题,但我不知道有什么著名的编程挑战像这样。它看起来很像一个调度问题。滑稽的电灯开关比喻让这个问题看起来很像家庭作业。它看起来不像任何与现实世界中的光开关有关的东西,所以在StAcExpLoT术语中,它充其量不过是AN。这不是一个C++问题。你最好先用铅笔和纸找出你的算法,然后在第一步完成后才写代码。我没有看算法,但一个突出的问题是你的内部循环中不必要的迭代,在那里你减去
    v[j].对于所有非
    i
    j
    ,从
    时间打开
    ;只需将向量中开关的所有
    开启
    时间相加(每个最外层环路一次),然后减去
    开启-v[i]。改为开启
    。这会将代码带到
    O(N^2)