Questions tagged «restricted-complexity»

要求所有答案满足特定时间复杂性限制的规范所面临的挑战。这可以是特定的(“您的答案必须是O(n ^ 2),其中n是输入中的项目数”),也可以是复杂的级别(“您的答案必须是多项式中的项目数的多项式输入”)。

4
广义格雷码
输入:由k个正整数组成的数组I。整数将不大于100且k≤100。 输出:您的代码必须输出所有可能的阵列ö长度的非负整数的ķ其限制是0≤ö 我 ≤我我。要从一个数组到下一个数组,您可以在数组中的一个值上加上或减去1。您的代码不得两次输出相同的数组。如果要输出的不同数组的数量很大,那么您的代码应该一直持续输出直到被杀死为止。 例子 如果我是一个k个数组,那么这就是迭代所有宽度为k的格雷码的问题,除了第一个和最后一个元素不需要一步就可以到达。 如果I = [2,1]这样,则输出数组的一种可能的排序是(0,0),(0,1),(1,1),(1,0),(2,0),(2,1) 如果I = [2,1,3]是,则输出数组的一种可能的排序是(0,0,0),(0,0,1),(0,0,2),(0,0,3),(0,1,3),(0,1,2),(0,1,1),(0,1,0),(1,1,0),(1,1,1),(1,1,2),(1,1,3),(2,1,3),(2,1,2),(2,1,1),(2,1,0),...。 这是一个代码挑战,用最短长度的源代码提交是成功的。不要让打高尔夫球的简短答案阻止您发布其他语言的答案。尝试用任何一种语言给出最短的答案。 这也是限制复杂性的挑战。从前一个输出数组(或第一个输出数组的程序开始)开始,每个新数组的输出都应经过O(k)时间。这意味着每个新输出数组(它们各自的长度为k)的运行时间不应大于O(k)。也就是说,应该花费与k成比例的时间,而不是例如k 2或2 k。注意,这不是每个输出的平均时间,而是每个输出阵列的最坏情况时间。 您可以假定对64位整数的所有算术可以在恒定时间内执行,就可以读取和输出它们,以及赋值,查找和更改数组中的值。 限制复杂度的结果之一是仅在程序退出时输出的解决方案是不可接受的。

11
解决秘书问题
该秘书问题被描述为一个如此著名的问题: 你需要新秘书 您有N个申请人,一次可以面试一次 面试后,您可以为每个申请人评分。您的计分系统永远不会给两个申请人相同的分数 面试申请人后,您必须立即给出“是”或“否” 您想要分数最高的申请人 解决方案是采访第一个floor(N/e)申请人,然后接受分数高于所有先前申请人的第一个申请人。如果没有一个更高的申请人,则返回最后一个申请人。有趣的是,这给了最高的申请人1/e时间百分比。 e指欧拉数。要获取的值e,您可以使用内置的log或将其硬编码为至少5个小数点。 输入: 不大于的唯一非负整数的非空数组2^31-1。 输出: 代表所选候选者的整数。要明确的算法是: floor(N/e)在数组的第一个元素中找到最大元素。 遍历其余元素,并返回比第1步中找到的最大值高的第一个元素。 如果所有元素都不高于,则返回最后一个元素。 例如,假设您的数组是[2,7,4,3,9,20],则N = 6和floor(N/e) = 2。数组的前2个元素是[2,7]。的最大值[2,7]为7。其余元素为[4,3,9,20]。大于第一个元素7是9,所以我们返回9。 测试用例: [0] => 0 [100] => 100 [100, 45] => 100 [0, 1] => 0 [45, 100] => 45 [1, 4, 5] => 4 [1, 5, 4] => 5 [5, …

15
选择最长的棍子
您是一位年轻的编程爱好者,与另外2个最好的朋友一起生活。每个星期,其中一个人必须完成房子的所有杂务,然后通过挑一根棍子来决定轮到谁。挑短棍的人会输掉所有的琐事。 由于所有人都是程序员,并且喜欢创建难题,因此您已将“选择最短的棍子”修改为计算机难题。 这是难题的规则。 您将获得一个2D矩阵,其中每列代表一根棍子。 在每一列中,1代表棒的一部分,0代表空白 当在每列从顶部到底,最初你0的,一旦你打1,棍子已经开始休息的列将充满1只有 您可以编写程序来选择一列。该栏中棍子的大小决定了获胜者/失败者。棒的大小==该列中的1s数。 但是,该程序只能具有线性最坏情况下的时间复杂度。 由于所有人都是程序员,因此您将知道其他人的程序是否正在限制时间复杂度极限。 您的工作是: 编写接受2D格式或字符串数​​组输入的程序或函数。 输入可以从STDIN /提示/控制台或函数参数中获取。 如果您正在从STDIN / prompt读取输入,则可以假定读取输入并将其转换为数组需要0倍的时间(即使您的答案中必须有这样做的代码) 确定其中最长的棍子。 输出可以是函数的返回值,也可以是STDOUT /控制台/警报。 程序/函数必须具有线性最坏情况下的时间复杂度,O(m+n)其中m为行n数和列数。 输入可以是以下格式之一: 2D阵列: [ [0, 0, 0, 0], [1, 0, 0, 0], [1, 1, 0, 1], [1, 1, 1, 1] ] 字符串数组: [ "0000", "1000", "1101", "1111" ] 输入将具有以下属性: 数组的大小未知,假定任何大小的矩形 在任何一列中,自上而下,如果您看到1,则下面的所有内容均为1 …

15
及时分箱
这项挑战中的任务是将数组的元素放入时间仓。输入将是一个非递减的正整数数组,该整数表示事件的时间,而整数则表示每个bin的大小。让我们从一个例子开始。我们称为输入数组A和输出数组O。 `A = [1,1,1,2,7,10]` and `bin_size = 2`. `O = [4,0,0,1,1]`. 为什么呢 使用a bin_size = 2,我们将具有以下间隔:在第一个间隔内(0,2], (2,4], (4,6], (6,8], (8,10]有四个项目,在第二个和第三个间隔(1,1,1,2)内(0,2]没有一个7,在间隔中(6,8]一个10,在间隔中一个(8,10]。 您的代码应考虑bin_size从开始的每个长度间隔,0并计算每个间隔中A有多少个数字。您应始终将区间的右端包括在bin中,因此在上面的示例2中将其包括在中4。您的代码应在输入和输出长度之和的线性时间内运行。 更多示例: `A = [1,2,7,12,15]` and `bin_size = 5`. `O = [2, 1, 2]`. `A = [1,2,7,12,15]` and `bin_size = 3`. `O = [2,0,1,1,1]`. 您可以假定输入和输出可以以您认为方便的任何格式给出。您可以使用任何喜欢的语言和库。

14
将数组放入垃圾箱
在这个简单的挑战中,将为您提供L非负整数的输入数组,以及数量b大于0但不超过的长度的bin L。您的代码必须返回一个新数组M,该数组的长度为b,并且已对该数组进行分箱L。用示例最容易解释。 L = [1,0,5,1]然后b = 2返回M = [1,6]。 L = [0,3,7,2,5,1]然后b = 3返回M = [3,9,6]。 到目前为止,如此简单。但是,在这个问题b上并不一定要分开len(L)。在这种情况下,最后一个垃圾箱将只有更少的数字可以组成。 除可能的最后一个垃圾箱外,每个垃圾箱必须具有相同数量的数字,以构成其总数。最后一个垃圾箱所贡献的号码不得超过其他垃圾箱。在其他规则的约束下,最后一个bin必须具有尽可能多的数字。 L = [0,3,7,2,5,1]然后b = 4返回M = [3,9,6,0]。 M = [10,8,0,0]是不可接受的输出,因为第三个bin的名称编号不包含在bin 1和中2。 L = [0,3,7,2,5]然后b = 2返回M = [10,7]。 M = [3, 14]不是可接受的输出,因为最后一个bin会有3贡献的元素,但是第一个只有2。 L = [1,1,1,1,1,1,1]然后b = 3返回M = [3,3,1]。 作为最后一条规则,您的代码必须在线性时间内运行。 您可以使用任何喜欢的语言或库,并且可以假定以您认为方便的任何方式提供了输入。 事实证明,有些输入无法解决。例如[1,1,1,1,1]和b=4。您的代码可以输出任何喜欢的输入。

23
多边形数
多边形数是ksize的一个点中的点数n。 您将得到n和k,并且您的任务是编写一个输出/打印相应编号的程序/功能。 计分 这是代码高尔夫球。以字节为单位的最短解决方案获胜。 例 的3RD六边形数(k=6, n=3)是28因为有28上面的点。 测试用例 可以从此Pyth测试套件生成。 用法:每个测试用例n在上,k下两行。 n k output 10 3 55 10 5 145 100 3 5050 1000 24 10990000 更多信息 在Wikipedia中:https://en.wikipedia.org/wiki/Polygonal_number 在Wolfram Mathworld中:http : //mathworld.wolfram.com/PolygonalNumber.html 在OEIS Wiki中:http : //oeis.org/wiki/Polygonal_numbers 各种n的n角数的OEIS序列:3 (A000217),4 (A000290),5 (A000326),6 (A000384),7 (A000566),8 (A000567),9 (A001106),10 (A001107),11 (A051682),12 (A051624),13 (A051865),14 (A051866),15 (A051867),16 (A051868),17 …

2
配对电容器
电容器因制造公差高而臭名昭著。在许多情况下这是可以接受的,但有时需要具有严格公差的容量。获得具有所需准确值的容量的常见策略是并联使用两个经过仔细测量的电容器,以使它们的容量总计达到所需范围。 在给定(一组)容量的情况下,此挑战的目标是将电容器配对,以使每对电容器的总容量在给定范围内。您还需要找到最佳的配对对,即配对对,以便找到尽可能多的配对。 约束条件 输入包括选择的格式 容量的无序列表,代表您拥有的(多个)电容器组 一对表示的下部和上部的能力结合的的目标范围(包括) 输入中的所有容量均为小于2 30的正整数,单位为pF(无关紧要)。 除了输入电容列表之外,您拥有的电容器组还包含无限数量的0 pF电容器。 输出以选择的格式包括容量对列表,以使每对容量之和在指定的目标范围内。既没有指定线对的顺序,也没有指定线对中的容量顺序。 输出中的任何电容出现的频率都不会比您拥有的一组电容器中出现的频率高。换句话说:输出的对不能重叠。 满足条件4和5的任何可能输出都不应该包含比程序产生的输出更多的容量对。 您的程序应在O(n!)时间终止,其中n是代表您拥有的电容器组的列表的长度 不得滥用漏洞 该目标范围,不得为空 计分 您的分数是解决方案的长度(以八位字节为单位)。如果您的解决方案设法在多项式时间O(n k)中解决了约k个问题,请将您的得分除以10。我不知道这是否实际上可行。 样品输入 范围100到100,输入数组100 100 100,有效输出: 0 100 0 100 0 100 范围100到120,输入数组20 80 100,有效输出: 0 100 20 80 输出20 100无效 范围90到100,输入数组50 20 40 90 80 30 60 70 40,有效输出: 0 90 20 …

3
书架上的书
我有一些书和一个书架。我想尽可能多地在书架上放书,但是我有一个规则。书籍的所有尺寸(高度,宽度和深度)应在书架上形成不增加的顺序。 这就是说,每本书必须至少与书本上的书本一样高。宽度和深度也一样。您不能旋转书籍以交换它们的高度,宽度和深度。 您应该编写一个程序或函数,该程序或函数给出所有书籍的尺寸作为输入输出,或者返回我可以放在架子上的最大书籍数量。 输入值 正整数的三元组列表,其中每个三元组定义一本书的高度,宽度和深度。 输入列表中至少会有一个三元组。 两本书可以沿任意多个维度具有相同的长度。 输出量 一个正整数,表示服从该规则的书架上可容纳的最大书籍数量。 时间复杂度 您的算法应该在书本数量上具有最坏情况的时间复杂度多项式。这意味着,例如以下时间复杂度均有效:O(N ^ 3),O(log(N)* N ^ 2),O(N)和以下无效:O(2 ^ N), O(N!),O(N ^ N)。 例子 输入=>输出 (1, 1, 1) => 1 (5, 2, 5), (1, 3, 5) => 1 (5, 2, 5), (1, 2, 5) => 2 (2, 2, 2), (2, 2, 2), …

1
雷区上的礼貌近视醉酒机器人
正如标题所示,此问题是@NP 礼貌的近视醉酒机器人的半启发 我们的可怜机器人在原点放置在笛卡尔网格上,每分钟之后,它会在四个方向(上,下,左,右)中的一个方向上移动1个单位。 之后ñ分钟,所有对电网活化潜在的地雷,杀死任何僵尸差可能会发现自己在他们。地雷位于满足等式| y | = | x |的所有整数坐标处。 挑战 作为输入,作为输出,您将获得n,即地雷爆炸发生前的分钟数n,您必须找到机器人死亡的可能性。 输入:代表n的自然数。 输出:让僵尸死亡的概率为p / q,其中p和q是相对质数(q不能为0,但p可以)。输出p。 规则 您的算法不得以指数或更高的时间运行。理想情况下,它应在多项式时间内或更短的时间内运行。 您的算法必须能够n在合理的时间内处理<20的输入(如果太难的话可以调整)。 这是一个代码高尔夫挑战。 对于给定的n遍历所有可能性,绝对不会被视为答案。 测试用例 1->0 2->3 4->39 6->135 8->7735 10->28287 n = 6的示例计算 我们有4种可能的移动方式:U,D,R和L。可采用的路径总数为4 ^ 6或4096。有4种可能的情况沿y = x着陆:x,y = ±1; x,y =±2; x,y =±3; 或x = y =0。我们将计算出以(1,1),(2,2)和(3,3)结束的方法数量,将它们乘以4即可得出其他象限,然后相加这就是最终以(0,0)结束的方式数量。 情况1:机器人在(3,3)处结束。为了使机器人在这里结束,它必须进行3次正确的动作,以及3次向上的动作。换句话说,到达此处的总方法是重新排列序列RROUUU中的字母的方法,即6选择3 = 20。 情况2:机器人在(2,2)结束。为了使机器人在此处结束,它可以进行2次向上移动,3次向右移动和1次向左移动;或2个向右移动,3个向上移动和1个向下移动。因此,到达此处的方法总数是重新排列序列RRRLUU和UUUDRR中的字母的方法的总和,二者均为(6选择1)*(5选择2)= …

8
画一个phi三角形
澄清:基本上,你需要这个 欧拉的totient函数的名称为phi。 让我们尝试计算phi(8) 首先,向后列出所有数字8,且不包括0或以下 8 7 6 5 4 3 2 1 现在找出哪些数字与8不共享因数(1不计数),并#在其位置放置a 。 8 # 6 # 4 # 2 # 删除数字。 # # # # - 现在执行此操作,但是将输出串成三角形 9 88 777 6666 55555 444444 3333333 22222222 111111111 --------- 123456789 # 排除非要素共享数 9 8# 7## 6#66 5#### 4#4#4# 3##3##3 2#2#2#2# …

23
找到正因数!
定义 如果数字大于零,则为正数。 如果数字(A)可以除以无余数,则它是另一个数字(B)的除数。AB 例如,2是6因的除数,2可以除以6余数。 目标 您的任务是编写一个带正数的程序/函数,然后找到所有除数。 限制 您不得使用任何与prime 或 factorization相关的内置函数。 算法的复杂度不得超过O(sqrt(n))。 自由 输出列表可能包含重复项。 输出列表不需要排序。 计分 这是代码高尔夫球。以字节为单位的最短解决方案获胜。 测试用例 input output 1 1 2 1,2 6 1,2,3,6 9 1,3,9

9
一个经典的排序代码高尔夫球问题
这是一个代码问题。 输入值 以最方便的格式列出非负整数。 输出量 以任何格式排序的相同列表最方便。 限制 在最坏的情况下,您的代码必须以O(n log n)的时间运行,这n是输入中整数的数量。这意味着例如随机快速排序。但是,还有许多其他选项可供选择。 不要使用任何排序库/函数/类似函数。另外,不要使用任何可以为您完成大部分排序工作的东西,例如堆库。基本上,无论您实施什么,都应从头开始实施。 您可以根据需要定义一个函数,但是请在实际运行的完整程序中显示该函数的示例。它应该在下面的所有测试案例中成功且快速地运行。 测试用例 In: [9, 8, 3, 2, 4, 6, 5, 1, 7, 0] Out:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] In: [72, 59, 95, 68, 84] Out:[59, 68, 72, 84, 95] In: [2, 2, 1, 9, 3, …

6
查找最近距离的总和
对于此任务,您的代码应采用整数X和Y的两个排序数组作为输入。它应该计算X中每个整数与其Y中最接近的数字之间的绝对距离之和。 例子: X = (1 5,9) Y = (3,4,7) 距离是2 +1 + 2。 X = (1,2,3) Y = (0,8) 距离是1 + 2 + 3。 您的代码可以采用任何方便的方式进行输入。 主要限制是您的代码必须在两个数组的总和中以线性时间运行。。(您可以假设将两个整数相加需要固定的时间。)

5
通函有限公司
挑战 让我们想象一个N介于0到0之间的整数元组M,并将其称为F。 总共(M + 1) ** N可能有F。 有多少个这样的Fs满足以下所有不等式(索引基于一)? F[n] + F[n+1] <= M 对于 1 <= n < N F[N] + F[1] <= M 编写一个使用两个正整数 N并M以任何方便的形式输出答案的程序或函数。 测试用例 (N,M) => Answer (1,1) => 1 (2,1) => 3 (3,1) => 4 (4,1) => 7 (1,2) => 2 (2,2) => 6 (3,2) => …

3
从单词列表中找到最短的字母
一个全字母短句是一个包含每个字母串a- z英文字母,不区分大小写的。(如果pangram包含一个字母的多个副本,或者除字母之外还包含非字母字符,则可以。) 编写一个程序或函数,其输入为字符串列表,并输出一个或多个具有以下属性的字符串: 每个输出字符串必须是一个字符集。 每个输出字符串必须通过串联输入列表中的一个或多个字符串来形成,并用空格分隔。 在具有这些属性的所有字符串中,每个输出字符串必须最短,或者最短。 许多程序将选择仅输出一个字符串;您只需要输出多个字符串,否则就不得不编写额外的代码来限制输出。 您可以假定输入中没有不可打印的字符或空格,并且输入的单词长度不超过(列表长度的自然对数的26倍)个字符。(但是,您可能不会假设输入内容只包含字母,或者仅包含小写字母;标点符号和大写字母完全可能。) 输入和输出可以任何合理的格式给出。为了测试您的程序,我建议使用两个测试用例:英语单词词典(大多数计算机都有一个),以及以下情况(不可能有完美的字母(26个字母)),因此您必须找到一个包含重复的字母): abcdefghi defghijkl ijklmnop lmnopqrs opqrstuvw rstuvwxyz 您应随程序一起提供程序输出的样本。(由于使用了不同的单词列表,这对于不同的人可能会有所不同。) 胜利条件 这是一个限制复杂度的 代码高尔夫挑战。优胜者是在多项式时间内运行的最短程序(以字节为单位)。(针对不知道这意味着什么的人的摘要:如果将单词列表的大小加倍,则程序的速度应不超过一个恒定因子。但是,有问题的恒定因子可能与您一样大例如,将它变慢4倍或8倍是有效的,但是变小它不是单词列表长度的一个因素;它变慢的因素必须加以限制。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.