牛客周赛 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;
}