为了账号安全,请及时绑定邮箱和手机立即绑定

Python执行缺陷思考

标签:
Python

今天做一个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.执行时间问题

对于执行时间问题最有效的方法就是减少循环次数:


webp

1

在解决这个问题的时候,首先想到的就是四层循环,但是有没有想过,这样的执行时间将会是多少。而且对比赛来说,在执行时间上基本就不可能通过。

所以通过分析这个题目,能拆分得到最大成绩的四个数,其实四个数的差距要尽量小,就像同样长度的一根绳子围成正方形的面积是最大的一个道理。

所以有了图中能够节省大量执行时间的循环策略,只用了两次循环,而且遍历的次数很少。当然这里为了解决篇幅,有兴趣的可以尝试用四层循环,然后算出两种方法的执行时间进行比较,应该是呈现量级的差距。

but,虽然减少了这么多时间,但是依然在执行时间上没法通过,不愧是中高级的比赛题目哈。

其他也还有另一种节约时间的细微方法:

对于列表,max比sort之后再取最大值是要节约时间的,在下面的模块会有解释。

2.资源分配的问题

首先给两张图:


webp

2

webp

3

图一,显然,拆分1的话是不可能出现16这种结果的,但是后面就没有才出现这种问题了。

接下来就看看程序的差异:


webp

4

webp

5

第一张图对于上面的第一个执行结果,因为太快,所以执行结果就乱了,或者说不是我们想要的结果。

但是将排序和取最大值分开之后就再也没有出现这样的问题,因为之间的间隔时间足矣让内存一个一个分配执行。同样的效果也可以在执行max函数之前睡一段时间起到同样的效果。

但这样总的时间就又会超过题目的限制,这个问题到现在我还是没有解决。


webp

6

一直就是这个鬼结果,在其他平台上执行就没问题。

但是如果引入进程或者线程或许能在输出正确结果的基础上,节约更多的时间,从而满足题目的要求。

如果有通过这样方式实现的同学可以和我交流交流。



作者:wapiti08
链接:https://www.jianshu.com/p/79425f29d7ce


点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消