2 条题解
-
1
容易得出分3组,去考虑,增,删,替,补,的关系
#include <bits/stdc++.h> using namespace std; void solve() { string s; cin >> s; int n = s.length(); bool has_da = false, has_xiao = false, has_shu = false; for (char c : s) { if (isupper(c)) has_da = true; if (islower(c)) has_xiao = true; if (isdigit(c)) has_shu = true; } int miss = 3 - (has_da + has_xiao + has_shu); vector<int> re; if (n > 0) { char now = s[0]; int cnt = 1; for (int i = 1; i < n; i++) { if (s[i] == now) cnt++; else { if (cnt >= 3) re.push_back(cnt); now = s[i]; cnt = 1; } } if (cnt >= 3) re.push_back(cnt); } int mi = 0; for (auto x : re) mi += x / 3;//替换次数 //所以用max if (n < 6) { cout << max({6 - n, mi, miss}) << '\n'; } else if (n <= 20) { cout << max(mi, miss) << '\n'; } else { int del = n - 20;//删除的机会,考虑删除对替换的影响 vector<int> m0, m1, m2; for (int x : re) { int mod = x % 3; if (mod == 0) m0.push_back(x); else if (mod == 1) m1.push_back(x); else m2.push_back(x); } int k1 = min(del, (int)m0.size()); mi -= k1; del -= k1; if (del > 0) { int k2 = min(del / 2, (int)m1.size()); mi -= k2; del -= k2 * 2; } if (del > 0) { mi -= del / 3; } cout << (n - 20) + max(mi, miss) << '\n'; } } signed main() { ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); int t = 1; // cin >> t; while (t--) { solve(); } return 0; }
信息
- ID
- 1118
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- (无)
- 递交数
- 38
- 已通过
- 10
- 上传者