帮忙解决一道题

来源:百度知道 编辑:UC知道 时间:2024/05/25 18:38:36
偶遇难题一道,百思不得其解,在此请诸位大牛帮忙...........

题目:http://www.vijos.cn/Problem_Show.asp?id=1005
(做完了可以提交)

(一共有40个测试点)(我只能过38个测试点,郁闷~~~~~~~~~~~~)

应该说能得分很容易,但想要得全就难了,请大牛们帮一下我这个菜鸟

一定要解决完所有的测试点哟!!!!!!!!!!

谢谢了.........
本人只会 C,C++,Pascal,其他的看不懂

如果因代码过长,而不能在这里发布,请与我联系(Email:
AnonymPine@126.com),谢谢!
==========================
rivercoming 和我想的差不多,我想大概也应该是这种做法吧。我用Pascal写了200多行代码解决了38个测试数据,唉。。。

zhanyun3 恩,我是学信息学的,那两个测试数据我也不知道是什么,就知道过不了。。。。郁闷呀。。。。

widebright 其实并不难理解,可以理解为模式串匹配,只不过用常规方法,怕是不行的

赵世孤龙 用模式串匹配做我觉得是Impossible

问题的关键在于分解字符串A,一般情况下(有一种特例需要特别处理,后面说),A的子串是递增的自然数序列,第一个数字k,之后是(k+1)……,注意最后一个子串可能不完整;最后计算k在字符串S中的具体位置(这个比较简单,我后面就只说怎么返回k吧)

因此你需要一个方法判断字符串A是否满足按子串递增的条件,我们暂时将它叫做F(子串数字),输入是第一个子串数字(如果满足条件就是我们的答案),判断后面的子串是这个数字的依次递增字符串,返回值可以设为int型,匹配成功返回答案,否则返回-1。
(具体流程比较烦杂,你自己想想吧,注意考虑进位的情况,比如9之后是10,99之后是100等,还有就是最后一个子串不一定完整)

下面是主程序的流程(语法不一定正确,呵呵):

for(int l = 1, l< len(A), l++)
{
i=A中长度为l的子串转换成的数字;
k=F(i);
if(k!=-1) 直接跳出循环返回k
}

基本就是这样了,下面再说一下前面说的特殊情况,这种情况就是以0串打头的字符串A,比如说0和01的输出都应该是10,02首次出现应该是在 20和21之间,0204应该在10204中首次出现。(写着写着发现问题没我原来想的简单,后面的解决方法也写不下去了,寒!)
可能可以用补位来解决?

背景 Background
George很喜欢数学,尤其是算数数系列。

描述 Description
他最喜欢的是数字的无穷序列,结果是把所有的自然数按升序排列。这个序列开始是: 1234567891011121314... 我们叫序列 S。然后 S[1] = 1, S[2] = 2, ... , S[10] = 1, S[11] = 0, ... , 以此类推。
George 现有一个数字系列 A ,他想知道在S中最早出现的位置。帮助他解决这个难题。

输入格式 Input Format
输入文件包含 A - 给出的数字系列。位数不超过 200。没有空格。

输出一个