1769. Old Ural Legend [ACM]

http://acm.timus.ru/problem.aspx?space=1&num=1769    原题链接

大致意思:

   在输入的字符串 "10123456789" 中有若干的子串(substring)可表示某个正整数, 找出一个最小的\不在这些子串中的正整数.    这里输出为 11.  (10, 1-9 均在) 

 

思路: ( 语境: Ruby) 


原来我是想总的长度有限制, 这个字符串能够表达的子串大小. 所以 我开始了brute force. (蛮力破解, 往往也是我先上手直观解决的方式.  而且往往也会以失败告终 - - ) . 


生成1..99999 的字符串数组 , 然后逐一用 .include? 方法 如果找到第一个不在的 则输出. 


效果, 当然  如果是个短串,这么做是没有问题, 可惜的是这里规定了1.0second.  因此这种方法只能放在了注释中. 


新的思路: 


原来是以目标出发, 换种角度, 以输入出发.   从输入串中不断的取下一段 看它有哪些可能(构造法)   然后在生成的一个大整数数组中标记已经构造出的整数. 

如  : 

    marker = Array.new ( 1000001, 0 )     


当一个串"123456" 出现, 那么它就会将  

1.2.3.4.5.6 \  12.23.34.45.56. .... 123456  这些子串对应的数组的值发生变化.   然后再对下段串进行分析 . 


注意的问题,  这些小子串最大长度是取5? 取6?     这个要去分析原串的最大长度.  

迭代优化:

   12345678 .  如果以5为长度   

第一段 12345

第二段 23456

第三段 34567

第四段 45678 


   为避免重复记录 应该考虑后段与前段的重复部分 如何避免?  


huh. that's all.  

 





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值