代码练习(2018 计算机学科夏令营上机考试)

题目

计算两个日期之间的天数

  • 代码
  • 模拟即可
  • 年份范围 1-3000,暴力枚举即可

回文子串

The Die Is Cast

  • 代码
  • 第一遍 dfs,为每一个芯片标号
  • 第二遍 dfs,找出每个芯片上的非连通 X 数目
  • 可以合并

Euro Efficiency

  • 代码
  • 题意
    • 给定 6 种面值的硬币(数量无限),让他们组成 1-100 的数
    • dp[i] 表示组成面值 i 花费的最小硬币数
    • 求出 \(\dfrac{\sum_{i=1}^{100}\mathrm{dp[i]}}{100}\)\(\max{\mathrm{dp[i]}}\)
  • 可以使用加法得到结果,也可以使用减法得到结果
  • dp 迭代至不动点即可
  • 注意数组要开大,因为可能出现如下情况
    • 可以先构造出大于 100 的, 然后差值减到 100 以下
1
2
// 1 5 25 30 80 81
// 100 = 80+25-5
  • 最大为 100,因此数组开到 600 就够了

重要逆序对

  • 代码
  • 归并排序的思想,在归并的时候计算重要逆序对数
  • 归并和计算的过程得分为两个

Tram

  • Floyd 算法
  • Bellman-Ford 算法
  • 注意输入某个结点可能指向 0 条边

食物链

  • 代码
  • 并查集
  • 能够确定关系的放在一个集合里

DFS spanning tree

  • TODO
  • DFS 树的特征是,所有的非树边边都是由子结点指向祖先结点