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;
}