std::vector<int> p; for (int i = 0; i + len <= n; i++) { if (s.substr(i, len) == str) { p.push_back(i + len); } }
std::sort(p.rbegin(), p.rend());
for (int i = 0; i < p.size(); i++) { s.insert(p[i], "Start"); }
while (s.find(str) != std::string::npos) { for (int i = 0; i + len < s.size(); i++) { if (s.substr(i, len) == str) { s = s.substr(0, i) + "ACM" + s.substr(i + len); break; } } } std::cout << s << "\n";
return0; }
Python 解法
1 2 3
n = input() s = input() print(str.replace(s, "GenshinImpact", "ACMStart"))
B. Rapids 学跳跃
思路:
一定要跳到最后一个位置,所以最后一个位置一定要走。
可以贪心的思考,一定要去掉前 n - 1 个位置中的最大的
m 个,这样使得结果一定是最小的。
时间复杂度:\(O(nlogn)\)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
voidsolve(){ int n, m; std::cin >> n >> m;
int a[n]; for (int i = 0; i < n; i++) { std::cin >> a[i]; } i64 ans = a[n - 1]; std::sort(a, a + n - 1); for (int i = 0; i + m + 1 < n; i++) { ans += a[i]; } std::cout << ans << "\n"; }
int a[n] = {}; for (int i = 0; i < n; i++) { std::cin >> a[i]; } i64 s[n + 1] = {0}; for (int i = 0; i < n; i++) { s[i + 1] = s[i] + a[i]; }
while (q--) { // O(1) 查询 int l, r; std::cin >> l >> r;
std::cout << s[r] - s[l - 1] << "\n"; }
return0; }
D. 图图的生存率
思路:
直接暴力枚举所有情况,或者用数学推理一下
这题赛时出现最多的就是 RE,很多同学几乎都没考虑除
0 的情况
时间复杂度:\(O(10^4 / 1)\)
解法一 (暴力):
1 2 3 4 5 6 7 8 9 10 11 12 13 14
voidsolve(){ int m, a, b; std::cin >> m >> a >> b;
int ans = 0; for (int i = 0; i <= 100; i++) { for (int j = 0; j <= 100; j++) { if (1LL * i * a + 1LL * j * b <= m) { ans = std::max(ans, i + 2 * j + 50); } } } std::cout << std::min(std::max(ans, 75), 100) << "%\n"; }