主题:第53次粗测结果
小黑骑DK [专家分:610] 发布于 2007-05-21 21:16:00
其实这道题我也不知道什么好方法。 crossbow如果看见了,能不能为大家讲一下你的方法 ?
yxs0001的方法我看不大懂。(把程序中的'1'改成'2','0'改成'1'就是题目的要求了) 似乎比别人快.
其余的大都是回溯的办法。
还有一种就是goal00001111和leejqy的方法,用子串去组合,但是结果都不符合要求.
goal00001111: n为150的时候,你的输出的最后6位是123321,明显3和3重复了。
还有就是strcat之前不应该p[0]=0;么?不加这句的话,我这边都是乱码,根本就没有写进去.
leejqy: 定义ch3的时候少了括号 !! 而且没加p[0] = 0;
//长度36的生成的子串
//length:18
//Which:35
//123132312321231213 123132312321231213
还有就是shen08343的代码:
你是想把所有满足条件的串都找出来(用i级生成所有i+1级,再从i+1级里删去不满足条件的)//i级就是长度为i的串
但是v_str_check里,迭代器似乎不能自减吧。C++有些忘了。我运行时那里有错误.
还有size--没有意义的.不明白你为什么要传size。
第一次测试刷去很慢的和错误的。 所说的很慢是当n为四位数(< 5000)时,等了十多秒都没有结果的。进入第二轮测试的大都不到一秒。
使用递归方法的大都慢,而且我n才几千的时候就已经栈溢出了。
这是进入第二轮测试的名单:crystalx hucheng poorb redbullivws yxs0001 雨中飞燕
//附上我的测试代码
[code=c]
//判断一个字符序列里是否有重复的部分 1为不满足条件
int test_str(const char *p, int n)
{
int i = 2;
for (; i<n; i++)
{
if (overlap(p,i) == 1)
{
printf("\nWhich:%d\n", i);
return 1;
}
}
return 0;
}
//判断一个序列是否有连续重复的部分(以第n个字母结束的子串)
int overlap(const char *p, int n)
{
int max = (n+1)/2;//如果有重复部分,则此长度是最大重复长度
int length = 1;
int end1, end2;//两个要比较的子串结尾
for (; length<=max; length++)
{
for (end1=n,end2=n-length; end1>n-length && p[end1]==p[end2]; end1--,end2--)
;//比较两个子串
if (end1 == n-length)//两子串相同,表明有重复
{
printf("\nlength:%d\n",length);
return 1;
}
}
return 0;
}
[/code]
大家如果有什么异议,问题都可以提出来。 第二次测试周末再测。欢迎大家提意见。
还有就是我是新手,不知道什么测试软件好 ? 大家能不能介绍一下 ?
回复列表 (共20个回复)
11 楼
shen08343 [专家分:2360] 发布于 2007-05-22 14:45:00
小黑骑DK:
我把我的cpp和exe文件用邮件发到你信箱了,你再试一下,肯定是可以的,否则我不可能交卷.谢谢
12 楼
shen08343 [专家分:2360] 发布于 2007-05-22 14:57:00
1 2 3 12 13
21 23 31 32 121
123 131 132 212 213
231 232 312 313 321
323 1213 1231 1232 1312
1321 1323 2123 2131 2132
2312 2313 2321 3121 3123
3132 3212 3213 3231 12131
12132 12312 12313 12321 13121
13123 13212 13213 13231 21231
请按任意键继续 . . .
21232 21312 21321 21323 23121
23123 23132 23212 23213 31213
31231 31232 31321 31323 32123
32131 32132 32312 32313 121312
121321 121323 123121 123132 123212
123213 131213 131231 131232 132123
132131 132312 132313 212312 212313
212321 213121 213123 213212 213231
231213 231232 231321 231323 232123
232131 232132 312131 312132 312313
请按任意键继续 . . .
请按任意键继续 . . .
312321231213 312321231321 312321231323 312321312132 312321312313
312321323121 312321323123 312321323132 313212312131 313212312132
313212313213 313212313231 313212321312 313212321323 313213121321
313213121323 313213123132 313213123212 313213123213 313231213123
313231213212 313231213231 313231232123 313231232131 313231232132
321231213123 321231213212 321231213231 321231321232 321231321312
321231323121 321231323123 321232131213 321232131231 321232131232
321232132312 321232132313 321312132123 321312132312 321312132313
321312313212 321312313213 321312313231 321312321231 321312321323
321323121312 321323121321 321323121323 321323123212 321323123213
请按任意键继续 . . .
321323132123 321323132131 323121312313 323121312321 323121321231
323121321232 323121323123 323121323132 323123212312 323123212313
323123213121 323123213123 323123213231 323132123121 323132123132
323132123213 323132131213 323132131231 323132131232
请按任意键继续 . . .
[em3]中间挖掉了太多
13 楼
小黑骑DK [专家分:610] 发布于 2007-05-22 15:28:00
[quote]小黑骑DK:
我把我的cpp和exe文件用邮件发到你信箱了,你再试一下,肯定是可以的,否则我不可能交卷.谢谢
[/quote]
我收到了, 也看了。 程序运行正常。可能编译器的问题吧, 你用的什么编译器啊 ?
不过话说回来, 你的程序和题目要求不一样,不好测试。题目只要求找一个的, 你全部找出来,时间,空间肯定比别人差很多。
你可以去看下yxs0001的代码, 他的没有回溯,直接往里面写。 很神奇,看不懂。
14 楼
雨中飞燕 [专家分:18980] 发布于 2007-05-22 15:33:00
lrn0409的代码测试结果:
Test 1:
Program pfan-53 Accepted
Time = 761 ms Memory = 272 kb
Test 2:
Program pfan-53 Accepted
Time = 3525 ms Memory = 1072 kb
Test 3:
Program pfan-53 Runtime Error
Test 4:
Program pfan-53 Runtime Error
Test 5:
Program pfan-53 Runtime Error
End of test, Score = 40
15 楼
shen08343 [专家分:2360] 发布于 2007-05-22 15:34:00
我用Borland C++ Builder 4.0
16 楼
小黑骑DK [专家分:610] 发布于 2007-05-22 15:37:00
lrn0409:
你的代码我让飞少测了, 10000和20000的时候你有结果,时间是少一些。
但是30000以后就有错误了。
你的代码在我机器上4000就栈溢出了。 可能机器老吧。。。
17 楼
shen08343 [专家分:2360] 发布于 2007-05-22 15:47:00
[quote]
不过话说回来, 你的程序和题目要求不一样,不好测试。题目只要求找一个的, 你全部找出来,时间,空间肯定比别人差很多。
[/quote]
全部找出来,时间,空间不一定比别人差很多。
我现在字串长定在12位的话,立即有结果,输出反正要不了1秒钟.
18 楼
雨中飞燕 [专家分:18980] 发布于 2007-05-22 16:16:00
[quote][quote]
不过话说回来, 你的程序和题目要求不一样,不好测试。题目只要求找一个的, 你全部找出来,时间,空间肯定比别人差很多。
[/quote]
全部找出来,时间,空间不一定比别人差很多。
我现在字串长定在12位的话,立即有结果,输出反正要不了1秒钟.[/quote]
串长为10000呢?
测试就是10000或以上
19 楼
goal00001111 [专家分:4030] 发布于 2007-05-23 10:30:00
对yxs0001的算法的理解及改进
void unoverlap(int n, char *p)
{
p[0] = '0';
p[1] = '1';
for (int i=1; i<=n/2; i++)//先写入由0和1构成的序列
{
if (p[i] == '0')
{
p[2*i] = '0';
p[2*i+1] = '1';
}
else
{
p[2*i] = '1';
p[2*i+1] = '0';
}
}
if ((n & 1) == 0)
{
p[n] = p[n/2];
}
for (int i=0; i<n; i++)//修正序列的值,不清楚原理从何而来,请yxs0001赐教
{
if (p[i] == p[i+1])
p[i] = '0';
else
p[i] = (p[i] - '0')*2 + p[i+1];
++p[i]; //把012转化成123
}
p[n] = '\0';
}
20 楼
goal00001111 [专家分:4030] 发布于 2007-05-23 10:49:00
总算理解了!
其实很简单!
void unoverlap(int n, char *p)
{
p[0] = '1';
p[1] = '2';
for (int i=1; i<=n/2; i++)//先写入由0和1构成的序列
{
if (p[i] == '1')//每隔i个数取相同的值,因为i是递增的,所以可以保证不会出现长度大于1的相同子串
{
p[2*i] = '1';
p[2*i+1] = '2';
}
else
{
p[2*i] = '2';
p[2*i+1] = '1';
}
}
for (int i=1; i<n; i++)//修正序列的值,把连续的两个相同值的后者改成第3个值就好了
{
if (p[i] == p[i-1])
p[i] = '3';
}
p[n] = '\0';
}
我来回复