牛客周赛 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;
}
posted @ 2024-07-01 21:14  KXDdesu  阅读(88)  评论(0编辑  收藏  举报