灰姑娘城堡 房间:帮忙解决一道题

来源:百度文库 编辑:杭州交通信息网 时间:2024/05/05 20:43:09
偶遇难题一道,百思不得其解,在此请诸位大牛帮忙...........

题目: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。没有空格。

输出一个整数。- 最小的 k ,使 A[1] = S[k], A[2] = S[k+1], ... A[len(A)] = S[k + len(A) -1], len(A) 表示 A 的长度。

样例输入 Sample Input
101

样例输出 Sample Output
10

题目好难理解啊,怀疑是从英语翻译过来的,翻译的那个人表达能里太差了吧。

看他的例子,k=10 了,可是输入是101,哪来的S[10], 真是的!

首先把s序列转化为字符串
(这个在vc中用cstring能较易实现)
接下来再把A序列也转化为字符串
用字符串匹配int k=find(s,a);
就可以了。
考虑到s太长,可以把S分成几段匹配
第一段比较不出时再进入第二段的比较
如此循环到找出k
要注意段与段的衔接

终于明白楼主的意思了,不过还是不太懂测试点是啥意思,是测试用例么?很长时间没有写程序了,我讲一下我的思路吧:

问题的关键在于分解字符串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中首次出现。(写着写着发现问题没我原来想的简单,后面的解决方法也写不下去了,寒!)
可能可以用补位来解决?

实在是写不下去了,呵呵,要是有兴趣,给我发消息我们继续交流,sigh

Ural State University Problem Archive
你是学信息学的
把那两个点贴出来
要不就没诚意

???呵呵,不知是作者语言表达能力太差,还是偶语言理解能力不行。反正我是没看懂什么意思