NOI2001解题报告【信息技术】.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
NOI 2001 解题报告 第一题:食物链(eat) 并查集。 本题如果想当然的认为直接确定每个物种属于ABC的哪种就错了。 实际上,我们只能得到部分的关系。 将每种动物看做一个点,如果A吃B,那么引一条有向边AB。 如图,对于左边的图,将D和B合并,就转换成右边的图。 维护这样的三角形环,用并查集处理点合并。 对于每个D,X,Y: D=1,如果X,Y属于不同的三角形环,那么将对应的3个点(X和Y,依边的指向依次确定以后的点)都合并,如果X,Y同属于一个三角形环却不是同一点,那么矛盾,判断是假话。 D=2,如果X,Y属于不同的三角形环,那么将对应的3个点(X指向的点和Y,依边的指向依次确定以后的点)都合并,如果X,Y同属于一个三角形环但Y不是X指向的点,那么矛盾,判断是假话。 因为每个点一开始都是一个孤点,为了编程的方便,为每个点添加两个虚点,构成一个三角形环,则在以后的操作中只需考虑三角形环的合并。 ? 第二题:反正切函数的应用(arctan) 根据公式4,不难得出: 枚举b,根据(1)计算b+c的值,只需要在附近寻找最近的整点坐标。 按照道理应该是同时在两边寻找,但实际上由于b+c在右侧增长十分缓慢,所以只在左侧找。 ? 第三题:聪明的打字员(clever) BFS,开一个大数组判重。 ? 第四题:炮兵阵地(cannon) ? 算法一:随机化+调整 顾名思义,每次随机一个平原位置,在该处放入一个炮兵,同时将该炮兵可以攻击到的所有炮兵去掉。更新最大值。 但这种随机是非常不稳定的。在此基础上加一点限制:每次去掉的炮兵数不能大于1,保证每次加入炮兵后总数不减。 加上这个限制后,在时间限制范围内随机3000000次,稳定性还可以,可以过5~7个数据(WA的数据差距也很小,看你RP了)。 如果是求较优解,这个方法诚然是不错的,但显然对于这道题来说,肯定存在更好的方法。 ? 算法二:动态规划 本题的动态规划并不好看出来。 注意m最大只有10,尝试以行为阶段进行动态规划。 就一行来说,在不考虑地形的条件下,放置炮兵的约束条件只有:相邻两炮兵的距离≥2。 可以用搜索的方式确定放置一行炮兵的所有方案,同时确定每种方案下的炮兵数num。(最多只有60种方案) 从炮兵的影响范围来看,对于第i行炮兵的放置,除了地形因素外,只须考虑i-1,i-2行炮兵的放置情况。 设dp[i,j,k]表示i-2行用方案j放置炮兵,i-1行用方案k放置炮兵的情况下,前i行最大能放置的炮兵数。 转移方程:max(dp[i,j,k]+num[u])→dp[i+1,k,u],方案u和j,k不矛盾且都符合地形限制。 ? 一些优化:每行的状态可以看成一个二进制数,这样可以大大节省空间。同时,在判断方案间是否矛盾以及是否符合地形时可以用为操作(and,or)从而可以减少运行时间。 ? 参考资料:《浅谈记忆化搜索》作者:吴景岳 ? 第五题:方程的解数(equation) 如果用搜索的话复杂度是O(mn),能想到的剪枝就是上下界判断,这个剪枝的强度不能保证在时限内出解。 换一种思路,因为n最大只有6,不妨将前三项留在左边,剩余的放到等号右边。 枚举等号左边所有可能的值,记录每个值对应的个数,再枚举等号右边的值,如果相等,则将对应的个数加到总数中。 因为没有足够的空间来存储所有的值,可以用Hash表来存储(去一个极大数的余数),用链表处理冲突。 做一个预处理来减少指数运算的速度,设x[i,j]=ip[j]即可。 ? 第六题:陨石的秘密(secret) 动态规划 设dp[i,j,k,d]表示用i对{}、j对[]、k对()组成的深度不超过d的SS表达式的个数。 一个SS表达式具有树结构。最外层的括号是该括号内所有次外层括号的父节点。 对于状态(i,j,k,d)来说,取出其中其中一部分括号(i’,j’,k’,i’≤i,j’≤j, k’≤k,i’+j’+k’0),用它组成一棵树,设其个数为single(i’,j’,k’,d);用剩下的(i-i’,j-j’,k-k’)组成若干棵树,其个数显然为dp[i-i’,j-j’,k-k’,d]。 根据加法原理和乘法原理有:dp[i,j,k,d]=∑single(i’,j’,k’,d)×dp[i-i’,j-j’,k-k’,d] 对于single(i,j,k,d),为它确定一个根节点,然后考虑它的儿子节点,因为该树要能包含所有的括号,所以优先考虑i,然后j,最后k。 于是有: 边界条件:dp[0,0,0,i]=1 题目要求深度恰好为d的表达式个数,则为dp[l1,l2,l3,d]-dp[l1,l2,l3,d-1]。 因为在计算dp的过程中只有+*运算,所以只需保留11380的余数。

文档评论(0)

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

1亿VIP精品文档

相关文档