今天做一个hackerearth的一个比赛题目,题目链接在这里:
https://www.hackerearth.com/challenge/competitive/september-circuits-18/algorithm/divide-number-a410603f/
如果访问不了的话,附上大致的题目要求:
Divide Number
Max. Marks: 100
Given integerN, you need to find four integersA,B,C,D, such that they're all factors ofN(A|N,B|N,C|N,D|N), andN=A+B+C+D. Your goal is to maximizeA×B×C×D.
Input format
First line contains an integerT(1≤T≤4⋅104), represents the number of test cases.
Each of the nextTlines contains an integerN(1≤N≤4⋅104, N4will not exceed 64 bit integer).
Output format
Tlines, each line contains the answer (A×B×C×D) to correspond test case. If there is no way to find such four numbers, output−1.
这个题目我在visual studio code上面的运行是成功的,但是在比赛界面上一直不能通过,可能涉及到了python处理数据的边界问题了,但那个方面的问题我还真是没有办法解决,但是我已经在数学问题上将执行时间降到了最低。
在这里我先陈述一些不能通过的两个表现(我自己通过经验得知):
1.执行时间问题(python本身的处理效果不佳)
2.执行时在资源分配上出现争夺(导致了不同输入的结果是相同的)--- 后面会阐述
所以这篇文章主要从两个方面来在阐述python和其他语言相比不好的地方:
1.执行时间问题
对于执行时间问题最有效的方法就是减少循环次数:
1
在解决这个问题的时候,首先想到的就是四层循环,但是有没有想过,这样的执行时间将会是多少。而且对比赛来说,在执行时间上基本就不可能通过。
所以通过分析这个题目,能拆分得到最大成绩的四个数,其实四个数的差距要尽量小,就像同样长度的一根绳子围成正方形的面积是最大的一个道理。
所以有了图中能够节省大量执行时间的循环策略,只用了两次循环,而且遍历的次数很少。当然这里为了解决篇幅,有兴趣的可以尝试用四层循环,然后算出两种方法的执行时间进行比较,应该是呈现量级的差距。
but,虽然减少了这么多时间,但是依然在执行时间上没法通过,不愧是中高级的比赛题目哈。
其他也还有另一种节约时间的细微方法:
对于列表,max比sort之后再取最大值是要节约时间的,在下面的模块会有解释。
2.资源分配的问题
首先给两张图:
2
3
图一,显然,拆分1的话是不可能出现16这种结果的,但是后面就没有才出现这种问题了。
接下来就看看程序的差异:
4
5
第一张图对于上面的第一个执行结果,因为太快,所以执行结果就乱了,或者说不是我们想要的结果。
但是将排序和取最大值分开之后就再也没有出现这样的问题,因为之间的间隔时间足矣让内存一个一个分配执行。同样的效果也可以在执行max函数之前睡一段时间起到同样的效果。
但这样总的时间就又会超过题目的限制,这个问题到现在我还是没有解决。
6
一直就是这个鬼结果,在其他平台上执行就没问题。
但是如果引入进程或者线程或许能在输出正确结果的基础上,节约更多的时间,从而满足题目的要求。
如果有通过这样方式实现的同学可以和我交流交流。
作者:wapiti08
链接:https://www.jianshu.com/p/79425f29d7ce