乌龟棋 NOIP2010复赛 提高组 试题二 解题代码_第1页
乌龟棋 NOIP2010复赛 提高组 试题二 解题代码_第2页
乌龟棋 NOIP2010复赛 提高组 试题二 解题代码_第3页
乌龟棋 NOIP2010复赛 提高组 试题二 解题代码_第4页
乌龟棋 NOIP2010复赛 提高组 试题二 解题代码_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、乌龟棋 (NOIP2010)复赛 提高组 试题二 解题代码 分类: C/C+ 解题代码 2011-07-23 18:56 271人阅读 评论(2) 收藏 举报 view plaincopy to clipboardprint?1. /* 2. 全国信息学奥林匹克联赛(NOIP2010)复赛 提高组 第二题 3. 【问题描述】 4. 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物。 5. 乌龟棋的棋盘是一行N 个格子,每个格子上一个分数(非负整数)。棋盘第1 格是唯一 6. 的起点,第N 格是终点

2、,游戏要求玩家控制一个乌龟棋子从起点出发走到终点。 7.  8. 1 2 3 4 5  N 9. 乌龟棋中M 张爬行卡片,分成4 种不同的类型(M 张卡片中不一定包含所有4 种类型 10. 的卡片,见样例),每种类型的卡片上分别标有1、2、3、4 四个数字之一,表示使用这种卡 11. 片后,乌龟棋子将向前爬行相应的格子数。游戏中,玩家每次需要从所有的爬行卡片中选择 12. 一张之前没有使用过的爬行卡片,控制乌龟棋子前进相应的格

3、子数,每张卡片只能使用一次。 13. 游戏中,乌龟棋子自动获得起点格子的分数,并且在后续的爬行中每到达一个格子,就得到 14. 该格子相应的分数。玩家最终游戏得分就是乌龟棋子从起点到终点过程中到过的所有格子的 15. 分数总和。 16. 很明显,用不同的爬行卡片使用顺序会使得最终游戏的得分不同,小明想要找到一种卡 17. 片使用顺序使得最终游戏得分最多。 18. 现在,告诉你棋盘上每个格子的分数和所有的爬行卡片,你能告诉小明,他最多能得到 19. 多少分吗? 20. 【输入】 21. 输入文件名torto

4、ise.in。输入文件的每行中两个数之间用一个空格隔开。 22. 第1 行2 个正整数N 和M,分别表示棋盘格子数和爬行卡片数。 23. 第2 行N 个非负整数,a1, a2, , aN,其中ai 表示棋盘第i 个格子上的分数。 24. 第3 行M 个整数,b1,b2, , bM,表示M 张爬行卡片上的数字。 25. 输入数据保证到达终点时刚好用光M 张爬行卡片, 26. 即N?1=Mi

5、 b1。 27. 【输出】 28. 输出文件名tortoise.out。 29. 全国信息学奥林匹克联赛(NOIP2010)复赛 提高组 30. 第 4 页 共 7 页 31. 输出只有1 行,1 个整数,表示小明最多能得到的分数。 32. 【输入输出样例1】 33. tortoise.in tortoise.out 34. 9 5 35. 6 10 14 2

6、0;8 8 18 5 17 36. 1 3 1 2 1 37. 73 38. 【输入输出样例 1 说明】 39. 小明使用爬行卡片顺序为1,1,3,1,2,得到的分数为6+10+14+8+18+17=73。注意, 40. 由于起点是1,所以自动获得第1 格的分数6。 41. 【输入输出样例2】 42. tortoise.in tortoise.out 43. 13 8 44.

7、4 96 10 64 55 13 94 53 5 24 89 8 30 45. 1 1 1 1 1 2 4 1 46. 455 47. 【数据范围】 48. 对于30%的数据有1  N 30,1 M 12。 49. 对于50%的数据有1  N 120,1 M 

8、50,且4 种爬行卡片,每种卡片的张数不会超 50. 过20。 51. 对于100%的数据有1  N 350,1 M 120,且4 种爬行卡片,每种卡片的张数不会 52. 超过40;0  ai  100,1  i  N;1  bi  4,1  i M。 53. 输入数据保证N?1=Mi b1。 54.  55

9、. */  56.   57.   58. #include <stdio.h>   59. #include <stdlib.h>   60.   61. #define IN_FILE_NAME    "tortoise.in"   62. #define OUT_FILE_NAME   "

10、tortoise.out"   63.   64. int g_iBlockNum = 0,g_iCardCnt = 0;  65. int g_iScordOut = 0;  66. int g_BlockScord350,g_Card120;  67.   68. void ReadFile()  69.   70. 

11、60;   int i = 0;  71.     FILE *fp = fopen(IN_FILE_NAME,"rb");  72.       73.     if (fp = NULL)  74.     

12、0; 75.         return;  76.       77.     fscanf(fp,"%d%d",&g_iBlockNum,&g_iCardCnt);  78.     for (i = 0;i < g_iBlockN

13、um;i+)  79.       80.         fscanf(fp,"%d",&g_BlockScordi);  81.       82.     for (i = 0;i < g_iCardCnt;i+) &#

14、160;83.       84.         fscanf(fp,"%d",&g_Cardi);  85.       86.     fclose(fp);  87.   88.   89.   90. void 

15、WriteFile()  91.   92.     int i = 0;  93.     FILE *fp = fopen(OUT_FILE_NAME,"wb");  94.     if (fp = NULL)  95.    

16、60;  96.         return;  97.       98.     fprintf(fp,"%d",g_iScordOut);  99.     fclose(fp);  100.   101.   102. void&

17、#160;InitNewCard(int *pCardOld,int *pCardNew,int iCardCnt,int iCardExcept)  103.   104.     /* 105.     *   功能: 把pCardOld的iCardCnt张卡片复制到pCardNew,但把 106.     *  

18、         第iCardExcept张卡片排除(实际复制iCardCnt - 1 张) 107.     */  108.     int j = 0;  109.     for(int i=0;i<iCardCnt;i+)  110.

19、       111.         if(iCardExcept != i)  112.           113.             pCardNewj = pCar

20、dOldi;  114.             j+;  115.           116.       117.   118.   119. int Play(int *pBlockScord,int 

21、*pCard,int iCardCnt)  120.   121.     /* 122.     *   功能: 从当前为pBlockScord的格子中找到一种选卡方法,使得 123.     *           游戏得到最多的分数,并返回这个分数

22、60;124.     *   参数: pBlockScord,指向格子数组指针 125.     *           pCard,指向卡片数组指针 126.     *           iC

23、ardCnt,剩余卡片数量 127.     *   实现: 主要是分治法,汉诺塔思想 128.     */  129.     int iMax = 0,iRet = 0;  130.     int iNumOfCard = pCard0;/卡片上的数字

24、   131.     int *pNewCard = NULL;  132.     if (iCardCnt = 1)  133.       134.         /递归出口,只有一张卡片时,自然只能得到脚下格子分数及走一步   

25、135.         /格子的分数   136.         return pBlockScordiNumOfCard+pBlockScord0;  137.       138.     for (int i=0;i<iCardCnt;i+) 

26、 139.       140.         pNewCard = new intiCardCnt;  141.         InitNewCard(pCard,pNewCard,iCardCnt,i);  142.       &

27、#160; /递归搜索   143.         /思想是,只要下一步能够得到最大值,那么当前返回的就是最大值   144.         iRet = Play(pBlockScord+pCardi,pNewCard,iCardCnt -1);  145.         if (iRet > iMax)  146.           147.      

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论