回 帖 发 新 帖 刷新版面

主题:第41次编程比赛主打题结果


kirby1985 同学的程序不能通过编译,希望下次提交代码前先在自己的机器上运行起来

第一轮, 测试数据用的是题目中给出的数据
str1 =  "abcdefg"
str2 =  "xadzfcy"

有下面三位同学给出了错误答案,其他人都安全通过
boxertony     1
hotzenplotz   2
孤独的猫      1


后面几轮的测试数据用下面的程序生成, rickone同学的建议和我得想法基本一致
通过改变两个参数SEED和LENGTH来控制生成不同的测试数据
char* str1;
char* str2;
#define LENGTH 29999
#define SEED   4

void genString(char* p, int len)
{
    for (int i=0; i<len; i++)
        p[i] = (rand() % 26) + 'a';
    p[len] = 0;
}

void Init(void)
{
    srand(SEED);

    str1 = new char[LENGTH+1];
    str2 = new char[LENGTH+1];

    genString(str1, LENGTH);
    genString(str2, LENGTH);
}

第二轮
seed=0; length=10, 正确答案应该是1
下面同学的程序给出错误答案, 其他所有同学顺利过关
WinWing             2
qantas18             5
sllone        2
其中WinWing错的有点可惜,数组下标差了1个位置,希望下次比赛能给自己多设计一些测试用例,这样的错误不难发现

第三轮
seed=1; length=100, 正确答案是28
下面三个程序倒在了这一轮
magicalking    2
willzhanglala(1)    32
willzhanglala(1)    32
现在剩下的就只剩下rickon和argentmoon两位同学了

第四轮,两个程序都给出正确答案,但是rickon稍快
seed=2; length=10000
rickone        1.60
argentmoon    1.75

第五轮,继续正确, rickone的速度优势更明显一些
seed=3; length=20000
rickone        6.2
argentmoon    7.0

第六轮,基本重复前两轮的结果
seed=4; length=29999
rickone        14.0
argentmoon    15.6

看到这里相信大多数人都和我一样,觉得冠军已经毫无悬念,
但是我还有最后一组数据
str1 = "\0"; str2 = "\0"
rickone        -842150656
argentmoon    0

很惊讶吧, rickone犯了一个很低级的错误
    memset(b,0,n+1);
应该是 memset(b, 0, (n+1)*sizeof(int));

本来这组数据我是想用来测第一轮的,但是担心杀伤力太大,想想还是留到后面吧,在测这组数据之前,我还担心可能会做无用功的,没想到就是它决定了最后的冠军归属

现在我宣布第41次编程比赛的冠军是argentmoon同学!!!

这次比赛的参赛同学不是很多,正确率也不高,可能是我给的时间不大好,下次我一定会改进
这道题目只要能识别出动态规划,实现起来非常简单,代码量也很小,如果没能看出来是动态规划,作起来就比较困难了. 

这次我给了大家一个相互challenge的机会,但是没有人有效的利用,非常可惜.argentmoon应该能从中学到一些, 万一我没有想到最后那一组数据,比赛结果就完全不同了.

口水题的结果我明天再公布

回复列表 (共19个回复)

沙发

没想到第2轮就被刷下来了,看来功底还是太弱了

板凳


哎,回家改了一下,改错了,把 
int a=digui(str1,++str2,step);
int b=digui(++ptr,str2,step+1);
改回
 int a=digui(str1,++str2,step);
 int b=digui(ptr,str2,step+1);
就好了,不过效率太低,向能够通过第三轮测试的同学致敬。
学习ing...

3 楼

我,。。。将新旧table混在一起了。

4 楼

唉,看题不仔细啊。我想当然地认为子串应该是连续的了。

5 楼

没想到这次离冠军这么近,呵呵~~

说老实话我用memset用得不多,用的时候还分不清第几个参数是做什么用的,还要查查~竟然栽到这里,活活

6 楼

看了一下rickone的程序,思想是一样的(LCS这么经典了),呵呵。
我开始怕内存爆掉,所以就用滚动数组,是(2n)的空间,而且是一个常数30000
rickone空间的n的,这点有优势。
因为memset一下,时间差别就出来了,不过rickone前面几组数据比较快的原因可能和里面memset写错了有一定关系(这样memset几乎不耗费时间)。

顺带问一下,是不是下一次要我出题了?我不太清楚规则,有人能说明一下吗

7 楼

好多人都是那样做的,这样比没什么意思感觉,所以我回了//希望有更好的算法,但是我的直觉告诉我LCS问题本身的复杂度就是O(n*m)的,直觉。

我在想前面的都通过了,是不是只要b[0]=0就可以了?呵呵

8 楼

刚好没看到消息。
星期天上了一下才知道错过了。


“应该是 memset(b, 0, (n+1)*sizeof(int));”最后一个参数是字节数而不是长度吗??

9 楼

[quote]看了一下rickone的程序,思想是一样的(LCS这么经典了),呵呵。
我开始怕内存爆掉,所以就用滚动数组,是(2n)的空间,而且是一个常数30000
rickone空间的n的,这点有优势。
因为memset一下,时间差别就出来了,不过rickone前面几组数据比较快的原因可能和里面memset写错了有一定关系(这样memset几乎不耗费时间)。

顺带问一下,是不是下一次要我出题了?我不太清楚规则,有人能说明一下吗[/quote]

是你了
我也是第一次,

10 楼

请问起讫时间?

我来回复

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