回 帖 发 新 帖 刷新版面

主题:第53次粗测结果

其实这道题我也不知道什么好方法。 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 楼

小黑骑DK:
我把我的cpp和exe文件用邮件发到你信箱了,你再试一下,肯定是可以的,否则我不可能交卷.谢谢

12 楼

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 楼

[quote]小黑骑DK:
我把我的cpp和exe文件用邮件发到你信箱了,你再试一下,肯定是可以的,否则我不可能交卷.谢谢
[/quote]
我收到了, 也看了。 程序运行正常。可能编译器的问题吧, 你用的什么编译器啊 ?

不过话说回来, 你的程序和题目要求不一样,不好测试。题目只要求找一个的, 你全部找出来,时间,空间肯定比别人差很多。 

你可以去看下yxs0001的代码, 他的没有回溯,直接往里面写。 很神奇,看不懂。

14 楼

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 楼

我用Borland C++ Builder 4.0

16 楼

lrn0409:
你的代码我让飞少测了, 10000和20000的时候你有结果,时间是少一些。
但是30000以后就有错误了。

你的代码在我机器上4000就栈溢出了。 可能机器老吧。。。

17 楼

[quote]
不过话说回来, 你的程序和题目要求不一样,不好测试。题目只要求找一个的, 你全部找出来,时间,空间肯定比别人差很多。 

[/quote]
全部找出来,时间,空间不一定比别人差很多。 
我现在字串长定在12位的话,立即有结果,输出反正要不了1秒钟.

18 楼

[quote][quote]
不过话说回来, 你的程序和题目要求不一样,不好测试。题目只要求找一个的, 你全部找出来,时间,空间肯定比别人差很多。 

[/quote]
全部找出来,时间,空间不一定比别人差很多。 
我现在字串长定在12位的话,立即有结果,输出反正要不了1秒钟.[/quote]
串长为10000呢?
测试就是10000或以上

19 楼

对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 楼

总算理解了!
其实很简单!
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';
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册