AtCoder Beginner Contest 285

C:abc285_brutmhyhiizp

题目大意

一串序列 A, B, ..., Z, AA, AB, ..., ZZ, AAA,... 给定一个字符串求在序列中的排名(保证存在)

思路

将每个 A 看作 \(1\)B 看作 \(2\),....,Z 看作 \(26\)

那么就可以看作为一个 \(26\) 进制的数,将其转化为 \(10\) 进制即可。

举个例子:字符串 AB,转化为 \(26\) 进制数 \(12\),转化为 \(10\) 进制答案就为 \(2\times 26^0+1\times 26^1=28\)

代码

code in here

D:Change Usernames

题目大意

给定 \(n\) 条边,由字符串 \(a\) 连向字符串 \(b\),判断最后图存不存在环。

思路

考虑字符串连边比较复杂,则将其映射成一个数值(点的编号),方便建边。

映射方式也很简单,记录变量 \(idx\),即为点的数量。每次输入一个字符串,如果此字符串没有在之前出现过,记录编号 ++idx

建完边后,只需要对图进行判环,通常做法是进行拓扑排序,如果最后队列中元素的数量为点的数量,那么就无环,反之。

代码

code in here

E:Work or Rest

思路

所有数组均在题目中表明或已说明。

第一次看没什么思路,但仔细观察会发现两个假期之间的贡献是可以直接计算出来的。

假设两个假期之间有 \(d\) 个工作日,且贡献为 \(B_i\)

  • \(d=0\) 时,\(B_i=0\)

  • \(d=1\) 时,\(B_i=A_1\)

  • \(d=2\) 时,\(B_i=2\times A_1\)

  • \(d=3\) 时,\(B_i=2\times A_1+A_2\)

  • \(d=4\) 时,\(B_i=2\times A_1+2\times A_2\)

  • \(d=5\) 时,\(B_i=2\times A_1+2\times A_2+A_2\)

  • $ \ ⋮$

也许你会疑问 \(B_i\) 咋算出来的,只需要每一个工作日的贡献加起来就行了。

然后总结一个规律:\(B_d=\sum^{d}_{i=1}A_{\frac{i+1}{2}}\),是下取整。\(B_d\) 可以直接前缀和计算。

接下来考虑 dp。

\(dp_{i,j}\) 表示前 \(i\) 天,且当前持续了 \(j\) 天工作日的最大贡献。

  • 第一种情况:若第 \(i+1\) 天选择继续工作,\(dp_{i,j}\) 转移到 \(dp_{i+1,j+1}\)
  • 第二种情况:若第 \(i+1\) 天选择休息,那么 \(dp_{i,j}+B_j\) 转移到 \(dp_{i+1,0}\)。(如果看不懂方程式说明没理解到 \(B\) 数组的含义)

最后考虑求答案,但是不是很方便。当在解决循环中的问题时,通常在头部固定一个属性。这样,就简化了从尾部到头部的连接。对于这道题,只需要把假日定义在一周的第一天就可以了。

代码

code in here

F

posted @ 2023-01-31 20:33  Otue  阅读(41)  评论(0编辑  收藏  举报