蓝书刘汝佳算法竞赛入门经典勘误.doc

蓝书刘汝佳算法竞赛入门经典勘误

#《算法竞赛入门经典》勘误 关于勘误?下面的勘误很多来自于热心读者,再次向他们表示衷心的感谢!我并不清楚这些错误实际是在哪个版本中改正过来的,所以麻烦大家都看一下。 有发现新错误的欢迎大家在留言中指出,谢谢! 一些一般性的问题?运算符?、?已经被废弃,请用min、max代替(代码仓库中的代码已更新,g++ 4.6.2下编译通过) 重大错误?p24. 最后一行,“然后让max=INF,而min=-INF”应该是“然后让max=-INF, 而min=INF”。 (感谢imxivid) p43. 最后,判断s[i..j]是否为回文串的方法也不难写出:int ok = 1; for(k = i; i=j; i++)应该为for(k = i; k=j; k++) (感谢imxivid) p45. 第七行和第九行i-j+1应为i+j+1。修改后: 1. { 2. for (j = 0; i - j = 0 i + j m; j++) 3. { 4. if (s[i - j] != s[i + j]) break; 5. if (j*2+1 max) { max = j*2+1; x = p[i - j]; y = p[i + j];} 6. } 7. for (j = 0; i - j = 0 i + j + 1 m; j++) 8. { 9. if (s[i - j] != s[i + j + 1]) break; 10. if (j*2+2 max) 11. {max = j*2+2; x = p[i - j]; y = p[i + j + 1]; } 12. } 13. }p53. 例题4-1. 组合数. 输入非负整数n和m,这里的n和m写反了。应是“输入非负整数m和n”。 p54. 举例中的m和n也写反了(真是个悲剧),且C(20,1)=20。 p71. 《周期串》代码的第8行,j++应为i++。 p72. 代码的第7行,“return”改为“break”以和其他地方一致。 p81. k为奇数和偶数的时候,分子和分母的顺序是不一样的。正确代码为: #includestdio.h int main() { int n; while(scanf(%d, n) == 1) { int k = 1, s = 0; for(;;) { s += k; if(s = n) { if(k % 2 == 1) printf(%d/%d\n, s-n+1, k-s+n); else printf(%d/%d\n, k-s+n, s-n+1); break; } k++; } } return 0; }以及: #includestdio.h #includemath.h int main() { int n; while(scanf(%d, n) == 1) { int k = (int)floor((sqrt(8.0*n+1)-1)/2 - 1e-9)+1; int s = k*(k+1)/2; if(k % 2 == 1) printf(%d/%d\n, s-n+1, k-s+n); else printf(%d/%d\n, k-s+n, s-n+1); } return 0; }上述代码已经更新到代码仓库中。 p83. 应为am * an = am+n。 (感谢zr95.vip) p85. 两张插图下面的文字“顺时针”、“逆时针”反了。 (感谢zr95.vip) p107. dfs函数有误,应为: void dfs(int x, int y) { if(!mat[x][y] || vis[x][y]) return; // 曾经访问过这个格子,或者当前格子是白色 vis[x][y] = 1; // 标记(x,y)已访问过 dfs(x-1,y-1); dfs(x-1,y); dfs(x-1,y+1); dfs(x

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档