- Three Friends
- Snow Walking Robot
- Yet Another Broken Keyboard
- Remove One Element
- Nearest Opposite Parity
- Two Bracket Sequences
Three Friends
\[ Time Limit: 1 s\quad Memory Limit: 256 MB \]
根据题意,把最大的减一,最小的加一,然后答案就是两倍他们的差值
view
#include
Snow Walking Robot
\[ Time Limit: 2 s\quad Memory Limit: 256 MB \]
考虑放成长方形,那么 \(L、R\) 方向能放的个数就是 \(L、R\) 的较少值,\(U、D\) 方向能放的个数就是 \(U、D\) 方向的较少值。
特殊考虑一下存在 \(L、R\) 为 \(0\) 个,或 \(U、D\) 为 \(0\) 个的方案就可以了,
view
#include
Yet Another Broken Keyboard
\[ Time Limit: 2 s\quad Memory Limit: 256 MB \]
直接根据题目模拟,令连续可用字符的个数 \(x\),答案就是所有的 \(\frac{x(x+1)}{2}\) 之和。
view
#include
Remove One Element
\[ Time Limit: 2 s\quad Memory Limit: 256 MB \]
- 令数组 \(b[]\) 表示以 \(i\) 结尾,往左最多可以取多少个数字
- 令数组 \(c[]\) 表示以 \(i\) 开头,往右最多可以取多少个数字
假设不用删除元素,那么 \(b[]\) 中的最大值就是一个答案。
考虑删掉一个元素,也就是把 \(a[i-1]\) 和 \(a[i+1]\) 合在了一起,那么就考虑 \(a[i-1]\) 和 \(a[i+1]\) 是否满足递增。如果满足递增的话,就会产生新的合法序列,其长度就是 \(b[i-1]+c[i+1]\)。
那么只要枚举删掉的元素是哪个,就可以计算答案了。
view
#include
Nearest Opposite Parity
\[ Time Limit: 2 s\quad Memory Limit: 256 MB \]
令 \(dp[maxn][0/1]\) 表示从 \(i\) 位置到最近的 偶数/奇数 需要跳的最小步数。
反向建图,例如从 \(i\) 跳到 \(j\),那么连一条 \(j\) 到 \(i\) 的边
初始时 \(dp[i][a[i]\%2]=0\),然后暴力 \(bfs\) 就可以算出每个状态,如果结束后还有哪个状态没有计算出来,那就是无法到达。
view
#include
Two Bracket Sequences
\[ Time Limit: 2 s\quad Memory Limit: 256 MB \]
考虑判断括号表达式是否合法的过程,整个栈中只会有 \((\),如果空栈时遇到一个 \()\) 就必然是不合法的。
如果全部字符串判断结束后栈中还有 \((\),那么想要让他变成合法的式子,只要补上相应多的 \()\) 就可以了。
因为要满足两个字符串都是构造出来的字符串的子序列,那么必然是可以贪心去判断是否是它的子序列的。
令 \(dp[i][j][k]\) 表示第一个字符串贪心到第 \(i\) 位,第二个字符串贪心匹配到第 \(j\) 位,栈中还有 \(k\) 个 \((\) 所需要的最少步数。
\(dp\) 的过程中,在保证满足 \(k\) 够的情况下,每次尝试在后面放一个 \((\) 或 \()\),看放入的这个括号对整个 \(dp\) 状态的改变。
那么最后的合法状态就是 \(dp[n][m][k]\) 形成的字符串在加上 \(k\) 个 \()\)。
view
#include