牛客周赛 Round 44
写在前面
代码需要手动展开!!!
A题
每三张删除一张,n / 3就是答案
点击查看代码
#include<bits/stdc++.h> #define all(x) (x).begin(), (x).end() #define fi first #define se second using i64 = long long; using pii = std::pair<int, int>; template<typename T> std::vector<T> read(T& n) { std::vector<T> a(n); for (auto& i : a) std::cin >> i; return a; } void solve() { int n; std::cin >> n; std::cout << n / 3 << '\n'; } int main() { std::cin.tie(nullptr); std::cout.tie(nullptr); std::ios::sync_with_stdio(false); int T = 1; //std::cin >> T; while (T --) solve(); return 0; }
B题
一个序列最大值和最大公约数相等 等价于 这个序列的所有数都相等
序列是可以不连续的,所以找到出现次数最多的数就行
点击查看代码
#include<bits/stdc++.h> #define all(x) (x).begin(), (x).end() #define fi first #define se second using i64 = long long; using pii = std::pair<int, int>; template<typename T> std::vector<T> read(T& n) { std::vector<T> a(n); for (auto& i : a) std::cin >> i; return a; } void solve() { int n; std::cin >> n; std::map<int, int> mp; int ans = 0; for (int i = 0; i < n; i ++) { int x; std::cin >> x; mp[x] ++; ans = std::max(ans, mp[x]); } std::cout << ans << '\n'; } int main() { std::cin.tie(nullptr); std::cout.tie(nullptr); std::ios::sync_with_stdio(false); int T = 1; //std::cin >> T; while (T --) solve(); return 0; }
C题
倒着对字符串进行操作
把每一位都变成0
注意一下进位即可
进位会影响后面的数位
点击查看代码
#include<bits/stdc++.h> #define all(x) (x).begin(), (x).end() #define fi first #define se second using i64 = long long; using pii = std::pair<int, int>; template<typename T> std::vector<T> read(T& n) { std::vector<T> a(n); for (auto& i : a) std::cin >> i; return a; } void solve() { std::string s; std::cin >> s; int ans = 0; std::reverse(all(s)); bool ok = false; for (int i = 0; i < s.size() - 1; i ++) { int x = s[i] - '0'; if (ok) { x ++; x %= 10; ans += (10 - x) % 10; } else { if (x == 0) { continue; } else { ans += 10 - x; ok = true; } } } std::cout << ans << '\n'; } int main() { std::cin.tie(nullptr); std::cout.tie(nullptr); std::ios::sync_with_stdio(false); int T = 1; std::cin >> T; while (T --) solve(); return 0; }
D题
记录一下每一个数的因数个数
因为因子个数不会超过100
所以可以对每种因子个数进行前缀和操作
然后再进行常数查询就可以了
点击查看代码
#include<bits/stdc++.h> #define int long long #define all(x) (x).begin(), (x).end() #define fi first #define se second using i64 = long long; using pii = std::pair<int, int>; template<typename T> std::vector<T> read(T& n) { std::vector<T> a(n); for (auto& i : a) std::cin >> i; return a; } void solve() { int n, q; std::cin >> n >> q; std::vector<int> a(n + 1); for (int i = 1; i <= n; i ++) { std::cin >> a[i]; } auto ct = [&](int x) -> int{ int cnt = 0; for (int i = 1; i <= x / i; i ++) { if (x % i == 0) { cnt ++; if (x / i != i) { cnt ++; } } } return cnt; }; std::vector<std::vector<int>> sum(201, std::vector<int> (n + 1)); for (int i = 1; i <= n; i ++) { int cnt = ct(a[i]); sum[cnt][i] += 1; } for (int i = 1; i <= 200; i ++) { for (int j = 1; j <= n; j ++) { sum[i][j] += sum[i][j - 1]; } } auto query = [&](int l, int r) -> int { int cnt = 0; for (int i = 1; i <= 200; i ++) { int x = sum[i][r] - sum[i][l - 1]; cnt += x * (x - 1) / 2; } return cnt; }; while (q --) { int l, r; std::cin >> l >> r; std::cout << query(l, r) << '\n'; } } signed main() { std::cin.tie(nullptr); std::cout.tie(nullptr); std::ios::sync_with_stdio(false); int T = 1; //std::cin >> T; while (T --) solve(); return 0; }
E题
先特判n < 8无解
让前n - 4项等于i + 4
n为奇数时,最后四个可以构造为2 1 4 3
n为偶数时,最后四个可以构造为1 2 3 4
点击查看代码
#include<bits/stdc++.h> #define all(x) (x).begin(), (x).end() #define fi first #define se second using i64 = long long; using pii = std::pair<int, int>; template<typename T> std::vector<T> read(T& n) { std::vector<T> a(n); for (auto& i : a) std::cin >> i; return a; } void solve() { int n; std::cin >> n; if (n < 8) { std::cout << -1 << '\n'; } else { for (int i = 1; i <= n - 4; i ++) { std::cout << i + 4 << " "; } if (n & 1) { std::cout << "2 1 4 3\n"; } else { std::cout << "1 2 3 4\n"; } } } int main() { std::cin.tie(nullptr); std::cout.tie(nullptr); std::ios::sync_with_stdio(false); int T = 1; //std::cin >> T; while (T --) solve(); return 0; }
F题
对于基环树,有且只有一个环
所以1~n的路径最多只有2条
知道这个结论后,直接dfs即可
点击查看代码
#include<bits/stdc++.h> #define all(x) (x).begin(), (x).end() #define fi first #define se second using i64 = long long; using pii = std::pair<int, int>; template<typename T> std::vector<T> read(T& n) { std::vector<T> a(n); for (auto& i : a) std::cin >> i; return a; } void solve() { int n; std::cin >> n; std::vector<std::vector<pii>> adj(n + 1); std::vector<int> vis(n + 1), f(n + 1, 1e9); for (int i = 1; i <= n; i ++) { int u, v; std::cin >> u >> v; adj[u].push_back({v, i}); adj[v].push_back({u, i}); } auto dfs = [&](auto self, int u, int dep) -> void { if (u == n) { for (int i = 1; i <= n; i ++) { if (!vis[i]) { f[i] = std::min(f[i], dep); } } return; } for (auto [v, id] : adj[u]) { if (!vis[id]) { vis[id] = 1; self(self, v, dep + 1); vis[id] = 0; } } }; dfs(dfs, 1, 0); for (int i = 1; i <= n; i ++) { if (f[i] > 1e6) { f[i] = -1; } std::cout << f[i] << '\n'; } } int main() { std::cin.tie(nullptr); std::cout.tie(nullptr); std::ios::sync_with_stdio(false); int T = 1; //std::cin >> T; while (T --) solve(); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具