首页 > 其他分享 >ZZJC新生训练赛第17场题解

ZZJC新生训练赛第17场题解

时间:2024-11-18 19:31:45浏览次数:1  
标签:std dist ZZJC 17 int 题解 cin input dp

难度分类(同一难度下按字典序上升)

  • 入门: J
  • 简单: G, E, D
  • 中等: I, B, k
  • 困难: F, A

J-解题思路

按照题意模拟即可

J-代码实现

for _ in range(int(input())):
    print(int(int(input()) ** 0.5))

G-解题思路

dp入门题跳台阶小改

G-代码实现

MOD = int(1e9 + 7)
dp = [0] * int(1e6 + 10)
dp[1] = 1
dp[2] = 2
dp[3] = 4
n = int(input())
for i in range(4, n + 1):
    dp[i] = (dp[i - 1] + dp[i - 2] + dp[i - 3]) % MOD
print(dp[n])

E-解题思路

欧拉筛预处理后,按照题目模拟即可

E-代码实现

#include <bits/stdc++.h>

const int N = 5e5 + 10;

std::vector<int> primes;
std::unordered_set<int> prime_set;
bool f[N];

void euler(int n) {
    for (int i = 2; i <= n; i++) {
        if (!f[i]) {
            primes.push_back(i);
            prime_set.insert(i);
        }
        for (int j = 0; j < primes.size() && i * primes[j] <= n; j++) {
            f[i * primes[j]] = true;
            if (i % primes[j] == 0) {
                break;
            }
        }
    }
}

int main() {
    std::ios::sync_with_stdio(0);
    std::cin.tie(0);
    std::cout.tie(0);

    euler(N - 1);

    int t;
    std::cin >> t;
    while (t--) {
        int x, flag = 0;
        std::cin >> x;
        for (int i = 0; i < primes.size() && primes[i] < x; i++) {
            for (int j = i; j < primes.size() && primes[i] + primes[j] < x; j++) {
                int p3 = x - primes[i] - primes[j];
                if (prime_set.count(p3)) {
                    std::cout << primes[i] << " " << primes[j] << " " << p3 << "\n";
                    flag = 1;
                    break;
                }
            }
            if (flag) {
                break;
            }
        }
        if (!flag) {
            std::cout << -1 << "\n";
        }
    }
}

D-解题思路

区间修改单点查询,树状数组或线段树都可以解决

D-代码实现

#include <bits/stdc++.h>

const int N = 2e5 + 10;
using i64 = long long;

i64 a[N], td[N], tid[N];
int n, q;

int lowbit(int x) {
    return x & -x;
}

void update(int k, int x) {
    for (int i = k; i <= n; i += lowbit(i)) {
        td[i] += x;
        tid[i] += (i64) k * x;
    }
}

i64 getsum(int k) {
    i64 res = 0;
    for (int i = k; i > 0; i -= lowbit(i)) {
        res += (k + 1) * td[i] - tid[i];
    }
    return res;
}

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    std::cout.tie(0);
    std::cin >> n;
    for (int i = 1; i <= n; i++) {
        std::cin >> a[i];
        update(i, a[i]);
        update(i + 1, -a[i]);
    }
    std::cin >> q;
    while (q--) {
        int op;
        std::cin >> op;
        if (op == 1) {
            int l, r, v;
            std::cin >> l >> r >>v;
            update(l, v);
            update(r + 1, -v);
        } else {
            int x;
            std::cin >> x;
            std::cout << getsum(x) - getsum(x - 1) << "\n";
        }
    }
}

I-解题思路

二分这个a最后对答案+1即可

I-代码实现

n = int(input())
c = list(map(int, input().split()))
l, r = min(c), max(c)
ans = float('inf')
while l <= r:
    mid = (l + r) // 2
    L = sum(abs(i - mid) for i in c)
    R = sum(abs(i - (mid + 1)) for i in c)
    ans = min(ans, L, R)
    if L < R:
        r = mid - 1
    else:
        l = mid + 1
print(ans + 1)

B-解题思路

思维题,先算必定操作的数后对于剩下的值XJB操作取最小即可

B-代码实现

n = int(input())
a = sorted(list(map(int, input().split())))
l, r = map(int, input().split())
t1 = t2 = t4 = t3 = 0  # t1必定加 t2必定减 t3波动加 t4波动减
for i in range(n):
    if a[i] < l:
        t1 += l - a[i]
        t3 += r - l
    elif a[i] > r:
        t2 += a[i] - r
        t4 += r - l
    if l <= a[i] <= r:
        t4 += a[i] - l
        t3 += r - a[i]
# print(t1, t2, t3, t4)
ans = min(t1, t2)
t1 -= ans
t2 -= ans
if t1:
    if t4 >= t1:
        print(ans + t1)
    else:
        print(-1)
elif t2:
    if t3 >= t2:
        print(ans + t2)
    else:
        print(-1)
else:
    print(ans)

K-解题思路

kruscal实现最小生成树的途中取s和t联通之前最大的边权就是答案

K-代码实现

#include <bits/stdc++.h>

using i64 = long long;

struct DSU {
    std::vector<int> fa, rank, siz;
    int cnt;

    DSU(int n) : fa(n + 1), rank(n + 1), siz(n + 1, 1), cnt(n) {
        for (int i = 1; i <= n; i++) {
            fa[i] = i;
        }
    }

    int find(int x) {
        if (fa[x] != x) {
            fa[x] = find(fa[x]);
        }
        return fa[x];
    }

    void merge(int x, int y) {
        int X = find(x), Y = find(y);
        if (X != Y) {
            siz[X] += siz[Y];
            if (rank[X] >= rank[Y]) {
                fa[Y] = X;
                rank[X] += (int) (rank[X] == rank[Y]);
            } else {
                fa[X] = Y;
            }
            cnt--;
        }
    }

    int size() {
        return cnt;
    }

    int count(int x) {
        return siz[find(x)];
    }
};

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    std::cout.tie(0);
    i64 n, m;
    std::cin >> n >> m;
    DSU dsu(n);
    std::vector<std::array<i64, 3>> g(m);
    for (int i = 0; i < m; i++) {
        i64 u, v, w;
        std::cin >> u >> v >> w;
        g[i] = {w, u, v};
    }
    int s, t;
    std::cin >> s >> t;
    std::sort(g.begin(), g.end());
    i64 ans = -1;
    for (auto [w, u, v] : g) {
        if (dsu.find(u) != dsu.find(v)) {
            dsu.merge(u, v);
            ans = w;
        }
        if (dsu.find(s) == dsu.find(t)) {
            break;
        }
    }
    std::cout << ans;
}

F-解题思路

正向建边反向建边跑两次dij即可

F-代码实现

#include <bits/stdc++.h>

const int inf = INT_MAX;
std::vector<std::vector<std::pair<int, int>>> g1;

void dijkstra(int s, std::vector<int>& dist) {
    int n = g1.size();
    dist.assign(n, inf);
    dist[s] = 0;
    std::priority_queue<std::pair<int, int>, std::vector<std::pair<int, int>>, std::greater<>> pq;
    pq.push({0, s});
    while (!pq.empty()) {
        auto [d, u] = pq.top();
        pq.pop();
        if (d > dist[u]) {
            continue;
        }
        for (auto edge : g1[u]) {
            auto [v, w] = edge;
            if (dist[u] + w < dist[v]) {
                dist[v] = dist[u] + w;
                pq.push({dist[v], v});
            }
        }
    }
}

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    std::cout.tie(0);
    int n, m;
    std::cin >> n >> m;
    g1.assign(n + 1, std::vector<std::pair<int, int>>());
    std::vector<int> from(n + 1), to(n + 1);
    for (int i = 0; i < m; i++) {
        int u, v, w;
        std::cin >> u >> v >> w;
        g1[u].emplace_back(v, w);
    }
    dijkstra(1, from);
    std::vector<std::vector<std::pair<int, int>>> g2(n + 1);
    for (int u = 1; u <= n; u++) {
        for (auto edge : g1[u]) {
            auto [v, w] = edge;
            g2[v].emplace_back(u, w);
        }
    }
    g1 = g2;
    dijkstra(1, to);
    int ans = 0;
    for (int i = 2; i <= n; i++) {
        if (from[i] < inf && to[i] < inf) {
            ans += from[i] + to[i];
        }
    }
    std::cout << ans;
}

A-解题思路

打表找规律

A-代码实现

for i in range(int(input())):
    y, m, d = map(int,input().split())
    if (m + d) % 2 == 0 or ((m == 9 or m == 11) and d == 30):
        print('YES')
    else:
        print('NO')

标签:std,dist,ZZJC,17,int,题解,cin,input,dp
From: https://www.cnblogs.com/udiandianis/p/18553437

相关文章

  • CF1793E
    link一道十分简明的序列题题意简述$n$ 个人,每个人都要给一个 $[1,m]$ 之间的整数,且每个 $[1,m]$ 间的整数需至少给一个人。每个人有一个阈值 $a_i$,若与第 $i$ 个人拥有相同数字的人数至少为 $a_i$(包括自己),那么他就是高兴的。多次询问,每次一个 $m$,求最......
  • 2024年11月17日 星期天 Go语言基础
    今日格言坚持每天进步一点点~一个人也可以是一个团队~学习全栈开发,做自己喜欢的产品~~Go语言的创始人Go语言的创始人有三位,分别是:RobertGriesemer:他参与开发了JavaHotSpot虚拟机。RobPike:他是Go语言项目的总负责人,曾是贝尔实验室Unix团队的成员,参与过Plan9、Inf......
  • odoo17 新增模块教程, 实战案例详细教程
    新增模块python3./odoo-binscaffoldgroup_send./addons会增加一个文件夹配置模块核心在于__manifest__.py#-*-coding:utf-8-*-{'name':"GroupSend",'summary':"Short(1phrase/line)summaryofthemodule'spurpose&qu......
  • Codeforces Round 988 (Div. 3) E题解析
    E题题目链接CodeforcesRound988(Div.3)题目描述题目的思路根据题目的意思,我们可以推断出算法时间复杂度应该在O(N)对于这道题而言,我们可以分析下思路首先我们先从1~n的范围里面询问答案如果出现0就跳过,因为无序操作如果出现非0答案temp就记录下1~i的01序列的个数如果......
  • [HCTF 2018]Warmup 详细题解
    知识点:目录穿越_文件包含static静态方法参数传递引用mb_strpos函数    mb_substr函数正文:页面有一张滑稽的表情包,查看一下页面源代码,发现提示那就访问/source.php 得到源码<?phphighlight_file(__FILE__);classemmm{publics......
  • CF1499D The Number of Pairs 题解 线性筛
    题目链接:https://codeforces.com/problemset/problem/1499/D题目大意:给你三个整数\(c,d,x\)(\(1\lec,d,x\le10^7\)),问:存在多少对正整数对\((a,b)\)满足:\[c\cdotlcm(a,b)-d\cdotgcd(a,b)=x\]其中,\(lcm(a,b)\)表示整数\(a\)和\(b\)的最大公约数,\(gcd(a,......
  • Alpha冲刺(6/14)——2024.11.17
    目录一、团队成员分工与进度二、成员任务问题及处理方式三、冲刺会议内容记录会议内容四、GitHub签入记录及项目运行截图GitHub签入记录五、项目开发进展及燃尽图项目开发进展燃尽图六、团队成员贡献表一、团队成员分工与进度成员完成的任务完成的任务时长剩余时间施......
  • [ABC380C] Move Segment 题解
    [ABC380C]MoveSegment题解本题主要考察思维能力,其实不难。题目大意给你一个字符串\(s\),\(s\)由\(0\)和\(1\)构成,将其分为块中只有一种数字的块。将给定的第\(k\)块数字为\(1\)的块与第\(k-1\)块合并,并输出修改后的字符串。思路分析直接按照题意模拟即可。建......
  • leetcode面试题 17.17. 多次搜索
    给定一个较长字符串big和一个包含较短字符串的数组smalls,设计一个方法,根据smalls中的每一个较短字符串,对big进行搜索。输出smalls中的字符串在big里出现的所有位置positions,其中positions[i]为smalls[i]出现的所有位置。示例:输入:big="mississippi"smalls=["is","ppi",......
  • CF 705 题解
    CF705题解AHulk模拟即可.BSpiderMan打sg表可以发现,奇数个球先手必败(sg=0),偶数先手必胜(sg=1).多个组合只要把sg值异或起来就好.CThor暴力模拟就可以了,用队列模拟.DAntMan结论:按照编号由小到大加入链表,每次尽量让答案最小贪心就是对的.若原来是......