1、 青少年国际和全国信息学(计算机)奥林匹克竞赛指导)组合数学的算法 和程序设计(吴文虎,王建德著,清华大学出版社,参加竞赛组合数学必学) 计算机算法设计与分析 (王晓东编著,最好的数据结构教材) 数据结构与算法 (傅清祥,王晓东编著,我所见过的最好的算法教材) 信息学奥林匹克竞赛指导1997-1998竞赛试题解析(吴文虎,王建德著,清华大学出版社) 计算机程序设计技巧 D.E.Kruth著,算法书中最著名的葵花宝典,大师的作品,难度大) 计算几何周陪德著 ACM国际大学生程序设计竞赛试题与解析(一) (吴文虎著,清华大学出版社) 数学建模竞赛培训教材 共三本 叶其孝主编 数学模型 第二版 姜启
2、源 随机规划 模糊数学 数学建模入门 徐全智 计算机算法设计与分析 国防科大 五 常见的几个网上题库 常用网站: 1)信息学初学者之家:http:/oibh.ioiforum.org/ (2)大榕树编程世界:/www.fjsdfz.org/drs/program/default.asp (3)中国教育曙光网:/www.chinaschool.org/aosai/ (4)福建信息学奥林匹克: (5)第20届全国青少年信息学奥林匹克竞赛:/www.noi2003.org/ (6)第15届国际青少年信息学奥林匹克竞赛:/www.ioi2003.org/ (7)全美计算机奥林匹克竞赛: (8)美国信息
3、学奥林匹克竞赛官方网站:/www.usaco.org/ (9)俄罗斯Ural州立大学:/acm.timus.ru/ (10)西班牙Valladolid大学:/acm.uva.es/problemset (11)ACM-ICPC:/icpc.baylor.edu/icpc/ (12)北京大学: (13)浙江大学: (14)IOI:/olympiads.win.tue.nl/ioi/ (15)2003年江苏省信息学奥林匹克竞赛夏令营: (16) (17) (18) (19) (20) colin_fox/colin_fox 五 如何备战ACM/ICPC 1,个人准备(算法书,习题集,网上做题和讨论
4、) 2,1000题=亚洲冠军=世界决赛 3,做好资料收集和整理工作 实验一:递归与分治1. 二分查找2. 合并排序3. 快速排序实验二:回溯1. 0-1背包问题2. 装载问题3. 堡垒问题(ZOJ1002)4. *翻硬币问题5. 8皇后问题6. 素数环问题7. 迷宫问题8. *农场灌溉问题(ZOJ2412)9. *求图像的周长(ZOJ1047)10. *骨牌矩阵11. *字母转换(ZOJ1003)12. *踩气球(ZOJ1004)实验三:搜索1. Floodfill2. 电子老鼠闯迷宫3. 跳马4. 独轮车5. 皇宫小偷6. 分酒问题7. *找倍数8. *8数码难题实验四:动态规划1. 最长公
5、共子序列2. 计算矩阵连乘积3. 凸多边形的最优三角剖分4. 防卫导弹5. *石子合并6. *最小代价子母树7. *旅游预算8. *皇宫看守9. *游戏室问题10. *基因问题11. *田忌赛马实验五:贪心与随机算法1. 背包问题2. 搬桌子问题3. *照亮的山景4. *用随即算法求解8皇后问题5. 素数测试实验目的理解递归算法的思想和递归程序的执行过程,并能熟练编写递归程序。掌握分治算法的思想,对给定的问题能设计出分治算法予以解决。实验预习内容编程实现讲过的例题:二分搜索、合并排序、快速排序。对本实验中的问题,设计出算法并编程实现。试验内容和步骤1 二分查找在对线性表的操作中,经常需要查找某
6、一个元素在线性表中的位置。此问题的输入是待查元素x和线性表L,输出为x在L中的位置或者x不在L中的信息。程序略2 合并排序3 快速排序实验总结及思考合并排序的递归程序执行的过程回溯算法实验目的:熟练掌握回溯算法实验内容:回溯算法的几种形式a) 用回溯算法搜索子集树的一般模式void search(int m) if(mn) /递归结束条件 output(); /相应的处理(输出结果) else am=0; /设置状态:0表示不要该物品 search(m+1); /递归搜索:继续确定下一个物品 am=1;1表示要该物品 b) 用回溯算法搜索子集树的一般模式 for(i=m;i=n;i+) swa
7、p(m,i); /交换am和ai if() if(canplace(m) /如果m处可放置 search(m+1); /搜索下一层 swpa(m,i); /交换am和ai(换回来) 习题1 0-1背包问题在0 / 1背包问题中,需对容量为c 的背包进行装载。从n 个物品中选取装入背包的物品,每件物品i 的重量为wi ,价值为pi 。对于可行的背包装载,背包中物品的总重量不能超过背包的容量,最佳装载是指所装入的物品价值最高。 程序如下:#include void readdata();void search(int);void checkmax();void printresult();int
8、c=35, n=10; /c: 背包容量;n:物品数int w10, v10; /wi、vi:第i件物品的重量和价值int a10, max; /a数组存放当前解各物品选取情况;max:记录最大价值 /ai=0表示不选第i件物品,ai=1表示选第i件物品int main() readdata(); /读入数据 search(0); /递归搜索 printresult();=n) checkmax(); /检查当前解是否是可行解,若是则把它的价值与max比较 /不选第m件物品 /递归搜索下一件物品void checkmax() int i, weight=0, value=0; for(i=0;
9、n; if(ai=1) /如果选取了该物品 weight = weight + wi; /累加重量 value = value + vi; /累加价值 if(weightmax) /且价值大于max max=value; /替换maxvoid readdata() int i; scanf(%d%d,&wi,&vi); /读入第i件物品重量和价值void printresult() printf(%d,max);2 装载问题有两艘船,载重量分别是c1、 c2,n个集装箱,重量是wi (i=1n),且所有集装箱的总重量不超过c1+c2。确定是否有可能将所有集装箱全部装入两艘船。提示:求出不超过c
10、1的最大值max,若总重量max /打印结果int canplace(int,int); /判断该位置能否放置皇后void place(int,int); /在该位置能否放置皇后void takeout(int,int); /把该位置放置皇后去掉int a8; /ai存放第i个皇后的位置=8) /当已经找出一组解时 printresult(); /输出当前结果 for(i=0;8;i+) /对当前行0到7列的每一个位置 if(canplace(m,i) /判断第m个格子是否能放堡垒 place(m,i); /在(m,i)格子上放置一个皇后 search(m+1); /递归搜索下一行 takeo
11、ut(m,i); /把(m,i)格子上的皇后去掉 int canplace(int row, int col)row; if(abs(i-row)=abs(ai-col)|ai=col) return(0); return(1);void place(int row, int col) arow=col;void takeout(int row, int col) arow=-1; int i,j; for(j=0;j=0&rowcolarowcol=0) return 1; return 0;8 农场灌溉问题(ZOJ2412)一农场由图所示的十一种小方块组成,蓝色线条为灌溉渠。若相邻两块的灌
12、溉渠相连则只需一口水井灌溉。给出若干由字母表示的最大不超过5050具体由(m,n)表示,的农场图,编程求出最小需要打的井数。每个测例的输出占一行。当M=N=-1时结束程序。Sample Input2 2DKHF3 3ADCFJKIHE-1 -1Sample Output23 提示:参考迷宫问题,实现时关键要解决好各块的表示问题。9 求图像的周长(ZOJ1047)给一个用 . 和X表示的图形,图形在上、下、左、右、左上、左下、右上、右下8个方向都被看作是连通的,并且图像中间不会出现空洞,求这个图形的边长。输入:首先给出m、n、x、y四个正整数,下面给出mn的图形,x、y表示点击的位置,全0表示结
13、束。输出:点击的图形的周长。2 2 2 2XX6 4 2 3.XXX.X.X.X.0 0 0 0 Sample output818参考迷宫问题,区别在于它是向8个方向填。10 骨牌矩阵多米诺骨牌是一个小正方形方块,每个骨牌都标有一个数字(06),现在有28组骨牌,每组两个,各组编号为128,每组编号对应的两个骨牌数值如下:00 01 02 03 04 05 0611 12 13 14 15 16 2223 24 25 26 33 34 3536 44 45 46 55 56 66现将这28组骨牌排成一个78矩阵,此时只能看到每个骨牌上的数字(06),而不能知道每组的组号(如左下图所示)。请编程
14、序将每组骨牌分辨出来(如右下图所示)。7X8骨牌矩阵 骨牌组编号矩阵66265241 28 28 14 7 17 17 11 1113201034 10 10 14 7 2 2 21 2313246654 8 4 16 25 25 13 21 2310432112 8 4 16 15 15 13 9 951360455 12 12 22 22 5 5 26 2655402603 27 24 24 3 3 18 1 1960534203 27 6 6 20 20 18 1 19void search(int n) 查找下一个还没放置骨牌的位置(x,y); 若没有,则表示已经找到一个解,输出并且返回; 尝试放置骨牌; 两次尝试都失败,进行回溯;尝试放置骨牌? 把在(x,y)处的骨牌作为当前骨牌组的一个骨牌; 把(x+1,y)处的骨牌作为当前骨牌组的另一个骨牌; 判断当前骨牌组是够未被使用,如果未被使用则递归放置下一个骨牌组; 把(x,y +1)处的骨牌作为当前骨牌组的另一个骨牌; 判断当前骨牌组是否未被使用,如
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1