Codeforces Round 913 (Div. 3)

1|0A. Rook


#include <bits/stdc++.h> using namespace std; #define int long long using pii = pair<int, int>; using node = pii; using i32 = int32_t; void solve(){ string s; cin >> s; for( char c = 'a' ; c <= 'h' ; c ++ ){ if( c == s[0] ) continue; cout << c << s[1] << "\n"; } for( char c = '1' ; c <= '8' ; c ++ ){ if( c == s[1] ) continue; cout << s[0] << c << "\n"; } } i32 main() { ios::sync_with_stdio(false), cin.tie(nullptr); int TC; for( cin >> TC ; TC ; TC -- ) solve(); return 0; }

2|0B. YetnotherrokenKeoard


#include <bits/stdc++.h> using namespace std; #define int long long #define mp make_pair using vi = vector<int>; using pii = pair<int, int>; const int inf = 1e18; void solve() { string s; cin >> s; vector<pair<int, char>> a, b; for (int i = 0; i < s.size(); i++) { if (s[i] == 'b') { if (!a.empty()) a.pop_back(); } else if (s[i] == 'B') { if (!b.empty()) b.pop_back(); } else if ('a' <= s[i] and s[i] <= 'z') a.emplace_back(i, s[i]); else b.emplace_back(i, s[i]); } int i, j; for (i = 0, j = 0; i < a.size() and j < b.size();) { if( a[i].first < b[j].first ){ cout << a[i].second; i ++; }else{ cout << b[j].second; j ++; } } for( ; i < a.size() ; i ++ ) cout << a[i].second; for( ; j < b.size() ; j ++ ) cout << b[j].second; cout << '\n'; return ; } int32_t main() { ios::sync_with_stdio(false), cin.tie(nullptr); int T; for (cin >> T; T; T--) solve(); return 0; }

3|0C. Removal of Unattractive Pairs


想了想,实际上和摆放的位置是没有关系的,所以一定可以把所有的相邻且不同的消除掉。

#include <bits/stdc++.h> using namespace std; #define int long long #define mp make_pair using vi = vector<int>; using pii = pair<int, int>; void solve() { int n; string s; cin >> n >> s; vi cnt(26); for (auto c: s) cnt[c - 'a']++; priority_queue<int> q; for (auto i: cnt) if (i > 0)q.push(i); for (int x, y; q.size() >= 2;) { x = q.top(), q.pop(); y = q.top(), q.pop(); x--, y--; if (x > 0) q.push(x); if (y > 0) q.push(y); } if (q.empty()) cout << "0\n"; else cout << q.top() << "\n"; } int32_t main() { ios::sync_with_stdio(false), cin.tie(nullptr); int T; for (cin >> T; T; T--) solve(); return 0; }

另一种考虑是思路是看出现次数最多是时候超过一半,如果没有超过就可以全部消掉。否则,最终剩下的就是出现最多的。

#include <bits/stdc++.h> using namespace std; #define int long long using i32 = int32_t; using vi = vector<int>; const int inf = 1e18; void solve() { int n; string s; cin >> n >> s; vi cnt(26); for (const auto &c: s) cnt[c - 'a']++; int m = *max_element(cnt.begin(), cnt.end()); if (m * 2 <= n) cout << n % 2 << "\n"; else cout << n - 2 * (n - m) << "\n"; return; } i32 main() { ios::sync_with_stdio(false), cin.tie(nullptr); int TC; for (cin >> TC; TC; TC--) solve(); return 0; }

4|0D. Jumping Through Segments


二分答案

check 就是维护每次可以达到区间并与目标区间求交集。如果为空集则移动范围小了。

#include <bits/stdc++.h> using namespace std; #define int long long #define mp make_pair using vi = vector<int>; using pii = pair<int, int>; const int inf = 1e18; void solve() { int n; cin >> n; vector<pii> a(n); for (auto &[l, r]: a) cin >> l >> r; int l = 0, r = 1e10, res = -1; auto check = [a](int k) { int l = 0, r = 0; for (const auto &[x, y]: a) { l -= k, r += k; l = max( l , x ) , r = min( r , y ); if( l > r ) return false; } return true; }; for (int mid; l <= r;) { mid = (l + r) / 2; if (check(mid)) res = mid, r = mid - 1; else l = mid + 1; } cout << res << "\n"; } int32_t main() { ios::sync_with_stdio(false), cin.tie(nullptr); int T; for (cin >> T; T; T--) solve(); return 0; }

5|0E. Good Triples


可以注意到是,在进行加法的时候不能发生进位,所以直接统计每一位的拆分方式就好了。

#include <bits/stdc++.h> using namespace std; #define int long long using vi = vector<int>; const int inf = 1e18; vi val( 10); void solve() { int n; int res = 1; cin >> n; for( ; n ; n /= 10 ) res *= val[n % 10]; cout << res << "\n"; return; } int32_t main() { ios::sync_with_stdio(false), cin.tie(nullptr); for( int x = 0 ; x <= 9 ; x ++ ){ for( int a = 0 ; a <= x ; a ++ ) for( int b = 0 ; a + b <= x ; b ++ ) val[x] ++; } int t; cin >> t; while (t--) solve(); return 0; }

6|0F. Shift and Reverse


题目给的串实际上就是循环同构,所有循环起点就是一定水最小值,且起点的上一位一定是最大值,我们可以暴力的找到这个位置,然后判断序列是否非降序。如果是非降序的把起点移动过来就好了。移动起点的方式有两种,一种是向前移动,还有一种是翻转一次后向后移动,我们取两种移动步数少的即可。

#include <bits/stdc++.h> using namespace std; #define int long long using pii = pair<int, int>; using node = pii; using i32 = int32_t; using vi = vector<int>; const int inf = 1e18; int minNotation(const vi s) { int n = s.size(); int i = 0, j = 1; for (int k = 0; k < n and i < n and j < n;) { if (s[(i + k) % n] == s[(j + k) % n]) k++; else { if (s[(i + k) % n] > s[(j + k) % n]) i = i + k + 1; else j = j + k + 1; if (i == j) i++; k = 0; } } return min(i, j); } void solve() { int n, t, q; cin >> n; vi a(n), b(n); for (auto &i: a) cin >> i; t = *min_element(a.begin(), a.end()); q = *max_element(a.begin(), a.end()); int res = inf; for (int i = 0, f = 1; i < n; i++) { if (a[i] != t) continue; if (a[(i - 1 + n) % n] != q) continue; f = 1; for (int j = 1; j < n and f; j++) { if (a[(i + j) % n] >= a[(i + j - 1) % n]) continue; f = 0; } if (f) res = min(res, min((n - i) % n, i + 2)); break; } reverse(a.begin(), a.end()); for (int i = 0, f; i < n; i++) { if (a[i] != t) continue; if (a[(i - 1 + n) % n] != q) continue; f = 1; for (int j = 1; j < n and f; j++) { if (a[(i + j) % n] >= a[(i + j - 1) % n]) continue; f = 0; } if (f) res = min(res, min(i + 1, (n - i) % n + 1)); break; } if (res == inf) cout << "-1\n"; else cout << res << "\n"; return; } i32 main() { ios::sync_with_stdio(false), cin.tie(nullptr); int TC; for (cin >> TC; TC; TC--) solve(); return 0; }

__EOF__

本文作者PHarr
本文链接https://www.cnblogs.com/PHarr/p/17879846.html
关于博主:前OIer,SMUer
版权声明CC BY-NC 4.0
声援博主:如果这篇文章对您有帮助,不妨给我点个赞
posted @   PHarr  阅读(264)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
历史上的今天:
2021-12-06 AtCoder Beginner Contest 230
点击右上角即可分享
微信分享提示