主题:第53次编程比赛结果
小黑骑DK [专家分:610] 发布于 2007-05-23 09:45:00
冠军就是yxs0001. 真的没有第二次测试的必要了, 压倒性的优势啊。
大家应该都没有意见吧 ?
void unoverlap(int n, char *p)
{
int i,j;
p[0] = '0';
p[1] = '1';
for(i=2;i<=n/2;i*=2){
for(j=i-1;j>=0;j--){
if(p[j] == '0'){
p[2*j] = '0';
p[2*j+1] = '1';
}
else{
p[2*j] = '1';
p[2*j+1] = '0';
}
}
}
if((n & 1) == 0){
p[n] = p[n/2];
}
for(i=(n-1)/2;i>=0;i--){
if(p[i] == '0'){
p[2*i] = '0';
p[2*i+1] = '1';
}
else{
p[2*i] = '1';
p[2*i+1] = '0';
}
}
for(int i = 0;i<n;i++){
if(p[i] == p[i+1])
p[i] = '0';
else
p[i] = (p[i] - '0')*2 + p[i+1];
}
p[n] = '\0';
}
盼望yxs0001能讲解一下你的思路。
回复列表 (共20个回复)
沙发
雨中飞燕 [专家分:18980] 发布于 2007-05-23 09:52:00
感觉就像是用公式做的
板凳
merry05 [专家分:8920] 发布于 2007-05-23 10:50:00
本人绝对的没意见,昨天拜读了一个晚上,愣是不知道这段程序的思想
希望yxs0001早点跳出来解释下~~~~~~~~~~~~
3 楼
goal00001111 [专家分:4030] 发布于 2007-05-23 11:25:00
yxs0001故弄玄虚!,呵呵!
其实可以这样做:
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';
}
4 楼
雨中飞燕 [专家分:18980] 发布于 2007-05-23 12:20:00
他的算法偶用数学方法证明出来了,结果是对的
很巧妙。。。。。。。。
5 楼
goal00001111 [专家分:4030] 发布于 2007-05-23 12:48:00
把证明写出来看看啊
6 楼
poorb [专家分:180] 发布于 2007-05-23 13:10:00
强大!! 这都看的明白...
期待版主大大 数学证明..
7 楼
丁香奶茶 [专家分:1460] 发布于 2007-05-23 16:51:00
等待...
8 楼
雨中飞燕 [专家分:18980] 发布于 2007-05-23 17:51:00
等偶整理一下证明过程
9 楼
雨中飞燕 [专家分:18980] 发布于 2007-05-23 19:09:00
yxs0001的算法证明:
以n=20为例:
源下标 0 1 2 3 4 5 6 7 8 91011121314151617181920
对应串 1 2 2 1 2 1 1 2 2 1 1 2 1 2 2 1 2 1 1 2 1
\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
目标串 1 3 2 1 2 3 1 3 2 3 1 2 1 3 2 1 2 3 1 2 0
两个相邻对应串的字符决定一个目标串字符
1 2 -> 1
2 1 -> 2
11,22-> 3
(对应的数可以随意)
(下文?表示1个1或2)
证明1:对应串不存在任意三个连续相同的数
对应串里的数两两分组,每组必然包含1和2;
因为任意三个连续的数必定包含一组,所以不存在
推论1:对应串不存在任意三个间距为1的相同的数(即1?1?1或者2?2?2)
或者,不存在任意三个间距为2^n-1的相同的数。
因为要出现1?1?1的必要条件是在它前面折半的位置出现三个连续相同的数
用数学归纳法,若间距是2^(n-1)-1不存在,可以得到间距是2^n-1也不存在(n>0)
证明2:对应串可能存在任意三个间距为2的相同的数,即形如1ab1AB1,但a!=A或者b!=B。
把它两两分组,假设是
1a b1 AB 1*
于是a=b=2,又因为A!=B,所以AB之中必有一个数与ab不相等
另一种分组法类似(成镜像),此处略,下同。
推论2:对应串可能存在任意三个间距为偶数的相同的数,形如1aaaa1bbbb1,但aaaa的内容与bbbb不全相同。
当间距是比2大的偶数的时候,假如是4,可表示为:
1abcd1ABCD1?
有类似分组为:
1a bc d1 AB CD 1?
所以,a=d=2,令A=D=2,得B=C=1,但因b!=c,矛盾;
当间距更大时,可以类似方法递推。所以满足这个条件的序列也不存在
推论3:对应串可能存在任意三个间距为非2^n-1形式的数的相同的数,但前半串与后半串不全相同。
这个证明简单,如果间距是奇数,如1?????1?????1,那么在前面折半的位置必然能找到
形如1??1??1这样的数,一直递降,最后必定出现证明2或者推论2的情况。
结论1:对应串中,任意三个间距为k的相同的数中:
k表达为2^n-1时,这样的序列不存在;
k不能表达为2^n-1时,中间所夹的两段子串不全相同。
或者可以表达为:对应串中不存在一对仅有一个公共元素且完全相同的子串。
结论2:由此对应串生成的目标串,不存在一对连续且相同的子串。
证毕。
10 楼
poorb [专家分:180] 发布于 2007-05-23 20:50:00
恩,
滔滔江水!!.
我来回复