Codeforces Round 898 (Div. 4)

1|0A. Short Sort


#include<bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(0), cin.tie(0); int t; cin >> t; for( string s ; t ; t -- ){ cin >> s; if( s == "abc" or s == "acb" or s == "cba" or s == "bac" ) cout << "YES\n"; else cout << "NO\n"; } return 0; }

2|0B. Good Kid


最小值加一

#include<bits/stdc++.h> using namespace std; #define int long long void solve(){ int n , res = 1 ; cin >> n; vector<int> a(n); for( auto &i : a ) cin >> i; sort( a.begin(), a.end() ); a[0] ++; for( auto i : a ) res *= i; cout << res << "\n"; return; } int32_t main() { ios::sync_with_stdio(0), cin.tie(0); int t; for( cin >> t; t ; t -- ) solve(); return 0; }

3|0C. Target Practice


#include<bits/stdc++.h> using namespace std; #define int long long vector<string> p = {"1111111111", "1222222221", "1233333321", "1234444321", "1234554321", "1234554321", "1234444321", "1233333321", "1222222221", "1111111111"}; void solve() { string s; int res = 0; for (int i = 0; i < 10; i++) { cin >> s; for (int j = 0; j < 10; j++) { if (s[j] == 'X') res += p[i][j] - '0'; } } cout << res << "\n"; } int32_t main() { ios::sync_with_stdio(0), cin.tie(0); int t; for (cin >> t; t; t--) solve(); return 0; }

4|0D. 1D Eraser


简单dp

#include<bits/stdc++.h> using namespace std; #define int long long void solve() { int n, k; string s; cin >> n >> k >> s; vector<int> a(n + 1), f(n + 1, INT_MAX); for (int i = 1; i <= n; i++) a[i] = a[i - 1] + (s[i - 1] == 'B'); f[0] = 0; for (int i = 1; i < k ; i++) { if (a[i] == 0) f[i] = 0; else f[i] = 1; } for (int i = k; i <= n; i++) { if (a[i] == a[i - 1]) f[i] = min(f[i], f[i - 1]); f[i] = min(f[i], f[i - k] + (a[i] > a[i - k])); } cout << f[n] << "\n"; return; } int32_t main() { ios::sync_with_stdio(0), cin.tie(0); int t; for (cin >> t; t; t--) solve(); return 0; }

5|0E. Building an Aquarium


二分答案

#include<bits/stdc++.h> using namespace std; #define int long long void solve() { int n, m; cin >> n >> m; vector<int> a(n); for (auto &i: a) cin >> i; auto check = [m, a](int h) { int cnt = 0; for (int i: a) cnt += max(0ll, h - i); return cnt <= m; }; int l = 0, r = 2e9 + 5, res = 0; for (int mid; l <= r;) { mid = (l + r) / 2; if (check(mid)) res = mid, l = mid + 1; else r = mid - 1; } cout << res << "\n"; return; } int32_t main() { ios::sync_with_stdio(0), cin.tie(0); int t; for (cin >> t; t; t--) solve(); return 0; }

6|0F. Money Trees


首先预处理每个点向后最远能到达的位置,然后前缀和维护一下果子的数量,最后二分长度即可。

#include<bits/stdc++.h> using namespace std; #define int long long void solve() { int n, k; cin >> n >> k; vector<int> a(n + 1), h(n + 1), lst(n + 1); for (int i = 1; i <= n; i++) cin >> a[i]; for (int i = 1; i <= n; i++) cin >> h[i]; for (int i = 1; i <= n; i++) a[i] += a[i - 1]; for (int i = 1, t; i <= n; i = t) { for (t = i + 1; t <= n; t++) if (h[t - 1] % h[t] != 0) break; for (int j = i; j < t; j++) lst[j] = t - 1; } auto check = [k,n,a,lst]( int x ){ for( int l = 1 , r = x ; r <= n ; l ++ , r ++ ){ if( r > lst[l] ) continue; if( a[r] - a[l-1] <= k ) return true; } return false; }; int l = 1, r = n, res = 0; for (int mid; l <= r;) { mid = ( l + r ) / 2 ; if( check(mid) ) res = mid , l = mid + 1; else r = mid - 1; } cout << res << "\n"; return; } int32_t main() { ios::sync_with_stdio(0), cin.tie(0); int t; for (cin >> t; t; t--) solve(); return 0; }

7|0G. ABBC or BACB


一个B可以把两侧的A全部消掉,所以只有当B的数量等于A的段数减一时,会有一段A无法被消掉,此时舍弃最小的一段。

#include <bits/stdc++.h> using namespace std; #define int long long const int inf = 1e18; using vi = vector<int>; void solve() { string s; cin >> s , s += 'B'; int cntB = -1, res; vector<int> a; for (int t = 0; auto i: s) { if (i == 'A') t++; else { cntB++; if (t > 0) a.push_back(t); t = 0; } } res = accumulate(a.begin(), a.end(), 0); if (cntB == a.size() - 1) { sort(a.begin(), a.end()); res -= a.front(); } cout << res << "\n"; return; } int32_t main() { ios::sync_with_stdio(false), cin.tie(nullptr); int t; for (cin >> t; t; t--) solve(); return 0; }

8|0H. Mad City


题目保证联通,所以图一定是基环树,要想实现永远追不上,这 b 要先跑到环上,所以a 要赶在b 到环上之前把他截住。所以找到 b 所在链和环的交点,判断谁先到交点即可。

#include<bits/stdc++.h> using namespace std; #define int long long using vi = vector<int>; constexpr int inf = 1e9; void solve() { int n, a, b; cin >> n >> a >> b; vector<vi> e(n + 1); vi deg(n + 1), vis(n + 1); for (int i = 1, u, v; i <= n; i++) { cin >> u >> v; e[u].push_back(v), e[v].push_back(u); deg[u]++, deg[v]++; } queue<int> q; for (int i = 1; i <= n; i++) if (deg[i] == 1) q.push(i), vis[i] = 1; for (int u; !q.empty();) { u = q.front(), q.pop(); for (auto v: e[u]) { if (vis[v]) continue; if (--deg[v] == 1) vis[v] = 1, q.push(v); } } auto bfs = [e, n](int u) { vi dis(n + 1, inf); queue<int> q; q.push(u), dis[u] = 0; for (int x; !q.empty();) { x = q.front(), q.pop(); for (auto y: e[x]) { if (dis[y] <= dis[x] + 1) continue; dis[y] = dis[x] + 1, q.push(y); } } return dis; }; vi d = bfs(b); int t = -1; for (int i = 1; i <= n; i++) { if (vis[i]) continue; if (t == -1 or d[i] < d[t]) t = i; } d = bfs(t); if( d[a] <= d[b] ) cout << "NO\n"; else cout << "YES\n"; return; } int32_t main() { ios::sync_with_stdio(0), cin.tie(0); int t; for (cin >> t; t; t--) solve(); return 0; }

__EOF__

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