首届山西省大学生程序设计大赛 - 决赛题解.pdf

首届山西省大学生程序设计大赛 - 决赛题解.pdf

  1. 1、本文档共17页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
首届山西省大学生程序设计大赛 - 决赛题解

首届山西省大学生程序设计大赛 暨第十一届中北大学程序设计大赛 题解 2016 年5 月30 日 Problem A 地宫寻宝 Problem B 多线程并发 Problem C 打牌 Problem D 数字键盘锁 Problem E 可见光通信 Problem F 相对距离 Problem G 剪纸片 Problem H 填方阵 Problem A 地宫寻宝 时间限制:1000ms 空间限制:65535KB 分析: 根据题目描述可知,此题只需找到从地图左上角到右下角的一条路径,且该路径经 过的房间中的宝藏价值之和最大。由于只能向下或向右走,满足无后效性,因此使用动 态规划(以下简称DP)是合适的。 设状态F[i,j,k]为走到坐标为(i,j)房间时,剩余氧气量为k 时的,可以携带最 多的宝藏价值(也可以换个思路k 为已使用了的氧气),则可以写出状态转移方程: F[i,j,k] =Max( F[i,j,k+1], F[i-1,j,k+C(i,j)]+P(i,j), F[i,j-1,k+C(i,j)]+P(i,j) ) 根据此状态转移方程,配合合法性检测即可完成题目。 时间复杂度:O(N*M*Y) 空间复杂度:O(N*M*Y) (可压缩至O( Min(N,M)*Y )) C/C++核心代码: //初始条件 if ( y = c[1][1] ) f[1][1][y-c[1][1]] = p[1][1]; //DP for ( int i=1; i=n; i++ ) { for ( int j=1; j=m; j++ ) { for ( int k=y-c[i][j]; k=0; k-- ) { if ( f[i][j][k] f[i][j][k+1] ) f[i][j][k] = f[i][j][k+1]; if ( f[i][j][k] f[i-1][j][k+c[i][j]] + p[i][j] ) f[i][j][k] = f[i-1][j][k+c[i][j]] + p[i][j]; if ( f[i][j][k] f[i][j-1][k+c[i][j]] + p[i][j] ) f[i][j][k] = f[i][j-1][k+c[i][j]] + p[i][j]; } } } Problem B 多线程并发 时间限制:1000ms 空间限制:65535KB 分析: 根据题目描述,我们只需要对每一个“父线程-子线程”关系将两颗对应的线程树合 并,最后统计数目并输出即可。对应如此大的数据量,使用并查集 (或称不相交集合) 是较好的方法,但需要注意最后统计前应当更新每一个节点的集合编号。 并查集的实现方法很多,大家可以自行查找学习,在此只给出一种实现。 时间复杂度:O(N) 空间复杂度:O(N) C/C++并查集的一种实现方法: int u[N+1]; //根节点记录 //根节点初始化 void Ini() { for ( int i=0; i=N; i++ ) u[i] = i; } //根节点寻找操作 int Find(

文档评论(0)

yan698698 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档