[问题] 超长字串的读取?

楼主: ddchris (克里斯)   2017-09-16 07:04:15
最近做 onlinejudge 时遇到一个状况,
题目会给出一个超长字串(皆为数字中间以空白分隔)
ex.10 200 3 6000 40545 87242 ... (长度约10^7个数字)
之前的处理方法都是先做切割(以空白分隔)再转成数字
list1 = input().split(' ')
list2 = [int(x) for x in list1]
但这题因为字串太长,在第一步骤时就产生 MemoryError的讯息
可是我又得判断出字串中所有数字(任取三个) "是否有机会形成一个三角形的边长"
像这样的状况 各位前辈们有什么较好的策略吗? 感谢!!
(新手自学中 问题若太嫩还请包涵...)
作者: Aerials (systemofadown)   2017-09-16 08:57:00
try 64-bit python? or use chunking or sqlite
作者: Django (Cython)   2017-09-16 11:44:00
每个数字的范围有上限吗?当数字多的时候 如果要任取三个数都无法形成三角形的话代表第3小的数至少是第1小的2倍 第5又至少是第3小的2倍所以如果有n个数任取三个都无法形成三角形 代表最大的数至少是最小的2^((n-1)/2)倍所以字串内含的数如果是int大小的话 n=70就已经肯定可以吧64bit也n=130左右就肯定可以了n=10^7如果还不行的话 里面不知是啥天文数字XD所以应该可以根据input限制 短于某个长度才来判别太长的就直接输出可以
作者: uranusjr (←這人是超級笨蛋)   2017-09-16 22:15:00
可以一次读一个再出来自己组, 读到不是数字就代表要断问题应该不是单一数字的大小, 是有很多个数字
作者: Django (Cython)   2017-09-17 00:47:00
有重复还是一样可以那样bound吧n超过100在那个范围内就不可能找不出三条凑三角形了你也不用真的去排序 排序只是证明必存在3条凑三角形而已100*10也顶多1000位 所以例如不到1000位就全读进来硬爆超过就直接输出可以'
作者: uranusjr (←這人是超級笨蛋)   2017-09-17 00:55:00
他的问题就是只会整行读不知道怎么只读几个数字啊 XD
作者: Django (Cython)   2017-09-17 00:59:00
所以他是input()爆掉不是split()爆哦
作者: uranusjr (←這人是超級笨蛋)   2017-09-17 01:05:00
看起来他只读部分行或读进来只拆部分项两个都不会啊 XD我的意思是他的问题不是算法, 而是在 Python 的使用
作者: Django (Cython)   2017-09-17 01:08:00
嗯应该是
作者: CaTom (Tom)   2017-09-17 09:21:00
(偷偷笔记) 最近改用python解zerojudge也对整行读取再切空格这点很苦恼(上周才问过类似问题)但相对的大数运算排列求幂那些全都可以轻松秒杀XD
作者: oToToT (屁孩)   2017-09-18 16:30:00
个人觉得python不适合做算法题
作者: s860134 (s860134)   2017-09-19 03:59:00
楼上怎么说@@
作者: CaTom (Tom)   2017-09-19 08:41:00
应该是python运行速度的问题硬伤吧? 像for相比C++慢了两个数量级 偏偏算法题为了考算法都是用大量测资要短时间内完成 其他语言可能用稍好的算法就能达成的py要苦思更精简快速的方式..

Links booklink

Contact Us: admin [ a t ] ucptt.com