【比赛链接】
【题解链接】
【A】 Dividing a String
【思路要点】
- 设一个划分中第一次出现长度超过 2 2 2 的 S i S_i Si 的位置为 i i i 。
- 则可以通过将 S i S_i Si 划分为更小的串,以及将 S i S_i Si 的某一个后缀拼接至 S i + 1 S_{i+1} Si+1 的方式使得第一次出现长度超过 2 2 2 的 S i S_i Si 的位置大于 i i i 。
- 从而可以证明至少存在一个最优解使得划分中的字符串长度均不超过 2 2 2 。
- 直接 d p dp dp 即可,时间复杂度 O ( ∣ S ∣ ) O(|S|) O(∣S∣) 。
【代码】
#include<bits/stdc++.h> using namespace std; const int MAXN = 2e5 + 5; typedef long long ll; typedef long double ld; typedef unsigned long long ull; template <typename T> void chkmax(T &x, T y) { x = max(x, y); } template <typename T> void chkmin(T &x, T y) { x = min(x, y); } template <typename T> void read(T &x) { x = 0; int f = 1; char c = getchar(); for (; !isdigit(c); c = getchar()) if (c == '-') f = -f; for (; isdigit(c); c = getchar()) x = x * 10 + c - '0'; x *= f; } template <typename T> void write(T x) { if (x < 0) x = -x, putchar('-'); if (x > 9) write(x / 10); putchar(x % 10 + '0'); } template <typename T> void writeln(T x) { write(x); puts(""); } int dp[MAXN][2]; char s[MAXN]; int main() { scanf("%s", s + 1); int n = strlen(s + 1); for (int i = 0; i <= n + 1; i++) dp[i][0] = dp[i][1] = -1e8; dp[0][0] = 0, dp[1][0] = 1; for (int i = 2; i <= n; i++) { chkmax(dp[i][0], dp[i - 1][1] + 1); if (s[i] != s[i - 1]) chkmax(dp[i][0], dp[i - 1][0] + 1); chkmax(dp[i][1], dp[i - 2][0] + 1); if (s[i] != s[i - 2] || s[i - 1] != s[i - 3]) chkmax(dp[i][1], dp[i - 2][1] + 1); } writeln(max(dp[n][0], dp[n][1])); return 0; }
【B】 RGB Balls
【思路要点】
- 首先,答案一定会乘上 N ! N! N! 。
- ∑ i ( c i − a i ) = ∑ i c i − ∑ i a i \sum_{i}(c_i-a_i)=\sum_{i}c_i-\sum_ia_i ∑i(ci−ai)=∑ici−∑iai ,因此,最小化 ∑ i ( c i − a i ) \sum_{i}(c_i-a_i) ∑i(ci−ai) 要求我们在 ∑ i c i \sum_ic_i ∑ici 不变的前提下最大化 ∑ i a i \sum_ia_i ∑iai ,或者在 ∑ i a i \sum_ia_i ∑iai 不变的前提下最小化 ∑ i c i \sum_ic_i ∑ici 。
- 考虑一个从前向后匹配的过程,不失一般性地,假设现在正要匹配一个 R R R 。
- 若存在一个 G B GB GB 或 B G BG BG ,一定只有将 R R R 加在它们的后面一定是最优的,这是因为如果加在 G , B G,B G,B 的后面,就会导致在 ∑ i a i \sum_ia_i ∑iai 不变的前提下 ∑ i c i \sum_ic_i ∑ici 变得更大。
- 否则,若存在 G G G 或 B B B ,一定只有将 R R R 加在它们的后面一定是最优的,这是因为如果加在空串的后面,就会导致在 ∑ i c i \sum_ic_i ∑