第七届北航程序设计大赛现场决赛解题报告.doc

第七届北航程序设计大赛现场决赛解题报告.doc

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

第七届北航程序设计大赛现场决赛解题报告 A. 大囧void draw(const int n, char map[][mapsize], const int r, const int c){ int size = (1 (n + 2)); map[r][c] = map[r + size - 1][c + size - 1] = +; map[r][c + size - 1] = map[r + size - 1][c] = +; for (int i = 1; i size - 1; i++) { map[r][c + i] = map[r + size - 1][c + i] = -; map[r + i][c] = map[r + i][c + size - 1] = |; } if (n == 0) return; for (int i = 2; i size / 2 - 1; i++) { map[r + i][c + size / 2 - i] = /; map[r + i][c + size / 2 + i - 1] = \\; } draw(n - 1, map, r + size / 2, c + size / 4); } 一个关键的问题其实是:这个字符矩阵应该全部初始化为32号字符(空格)而不是0号字符(虽然这种情况,你的IDE在屏幕上输出的内容可能“看起来”是正确的)。很多人都是错在这一点上。 B. 切棍棍马后最大路劲值f[i][j] = max{ min(f[k][j-1], w[k][i]) | k = 1..n 且 k != i } 初始也很简单,就是: f[s][0] = +∞,f[i][0] = 0(i != s) 于是,最后的结果就是: answer = max{ f[t][j] / j | 0 j n } (j = n则必定有环,有环就必定不会最优,所以j应该小于n) 关键就是将路径长度作为状态函数的参数。 E. n以内约数最多的数 那么n的约数就有这么多个: 即与其质因子其实没有关系,而只是与质因子的指数有关。因为我们想要找到约数最多且尽可能小的数。所以p1、p2、……、pk肯定是最小的那些质数。 考虑到前16小的质数之积已经超过109了。于是就只需要枚举最小的16个质数的指数分配情况,就可以求得要求的数。可以考虑用一个递归函数来处理枚举和求解,比如: const int pcount = 16; const long long p[] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,53,59}; void find(int i, long long n, int maxe, long long w, long long y){ // 现在前 i 小的质数都不能用,要找到不超过 n 且各质因子指数不超过 maxe 的数 // 将这个数和其约数的个数用 w 和 y 返回 w = y = 1; if (i = pcount) return; int e = 0; // p[i] 的指数 long long pe = 1, we, ye; while (pe = n e = maxe) { find(i + 1, n / pe, e, we, ye); if (ye * (e + 1) y || (ye * (e + 1) == y we * pe w)) { y = ye * (e + 1); w = we * pe; } e++; pe *= p[i]; } } 对于输入的n,其结果就可以通过 find(0, n, 32, w, y) 来求得。 F. 小白鼠 对于这颗二叉树的任意一颗子树,如果我们用T表示:现在已经通过之前的实验确定有毒饮料就在这棵子树的某个叶子节点中,进一步确定具体哪瓶有毒的实验次数的期望;P表示:这棵子树所有叶子节点对应的饮料有毒的概率之和,那么: 即 再展开下去就会发现:T*P不就是各个叶子的P乘以其到根的距离之和么。而对于根节点来说,其P总是1,于是有结论:一个方案的期望试验次数为各个叶子节点到根的距离乘以其对应的瓶子里面有毒的概率之和…… 这不就是带权路径长度嘛,于是要让期望的试验次数最小,就只需要构造一颗哈夫曼树,然后将除根节点外的所有节点的P全部加起来就行了。 G. 最少的扇形

文档评论(0)

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

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

1亿VIP精品文档

相关文档