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

ZZJC新生训练赛第十八场题解

时间:2024-11-25 20:46:03浏览次数:6  
标签:std return ZZJC 新生训练 int 题解 i64 ans input

链接:https://www.nowcoder.com/acm/contest/97429
密码:gar615gdsr

难度分类

  • 题目分值决定

A-解题思路

除一下比较分数大小即可

A-代码实现

a, b = map(int, input().split())
x, y = map(int, input().split())
if a / b > x / y:
    print(">")
elif a / b == x / y:
    print("=")
else:
    print("<")

B-解题思路

已经固定矩阵大小,枚举分界线后遍历即可

B-代码实现

f = 1
g = []
for i in range(9):
    g.append(list(map(int, input().split())))
    if len(set(g[i])) != 9:
        f = 0
for x in [0, 3, 6]:
    for y in [0, 3, 6]:
        st = set()
        for i in range(3):
            for j in range(3):
                st.add(g[x + i][y + j])
        if len(st) != 9:
            f = 0 
if f:
    print("Valid")
else:
    print("Invalid")

C-解题思路

对n取余除3直到n是0即可

C-代码实现

n = (int(input()))
ans = ""
while n > 0:
    ans = str(n % 3) + ans
    n //= 3
print(ans)

D-解题思路

看看每一天用哪种方式更划算然后求和即可

D-代码实现

n, c = map(int, input().split())
a = list(map(int, input().split()))
dp = [a[0]] * n
for i in range(1, n):
    dp[i] = min(dp[i - 1] + c, a[i])
print(sum(dp))

E-解题思路

算一下中间过程中会扣除的最大生命值即可,注意最后要+1保证是正数

E-代码实现

n = int(input())
a = list(map(int, input().split()))
ans = pre = 0
for i in a:
    pre += i
    ans = min(ans, pre)
print(abs(ans) + 1)

F-解题思路

双指针谁小优先选谁即可

F-代码实现

s = input()
t = input()
 
i, j = 0, 0
n, m = len(s), len(t)
ans = []
 
while i < n and j < m:
    if s[i] <= t[j]:
        ans.append(s[i])
        i += 1
    else:
        ans.append(t[j])
        j += 1
 
if i < n:
    ans.append(s[i:])
if j < m:
    ans.append(t[j:])
 
print("".join(ans))

G-解题思路

按照截止排序,看完成时间会不会和开始时间有交叉

G-代码实现

#include <bits/stdc++.h>

using i64 = long long;

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

    int n;
    std::cin >> n;

    std::vector<std::array<int, 2>> dt(n);
    for (int i = 0; i < n; i++) {
        std::cin >> dt[i][0] >> dt[i][1];
    }

    std::sort(dt.begin(), dt.end());

    i64 sum = 0;
    for (auto [d, t]: dt) {
        sum += t;
        if (sum > d) {
            std::cout << "No\n";
            return 0;
        }
    }
    std::cout << "Yes\n";
}

H-解题思路

中位数附近就是最小值

H-代码实现

#include <bits/stdc++.h>

using i64 = long long;

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

    int n;
    std::cin >> n;

    std::vector<int> x(n);
    for (int i = 0; i < n; i++) {
        std::cin >> x[i];
    }

    std::sort(x.begin(), x.end());

    i64 ave1 = x[n / 2], ave2 = x[n / 2 + 1], ans1 = 0, ans2 = 0;
    for (int i = 0; i < n; i++) {
        ans1 += abs(ave1 - x[i]);
        ans2 += abs(ave2 - x[i]);
    }

    std::cout << std::min(ans1, ans2);
}

I-解题思路

求卡特兰数

I-代码实现

#include <bits/stdc++.h>

using i64 = long long;
const int N = 1e6 + 10;
const int MOD = 1e9 + 7;

std::vector<i64> fac(N + 1, 1), invfac(N + 1, 1);

i64 ksm(i64 a, i64 n, i64 mod) {
    i64 res = 1;
    a = (a % mod + mod) % mod;
    while (n) {
        if (n & 1) {
            res = (a * res) % mod;
        }
        a = (a * a) % mod;
        n >>= 1;
    }
    return res;
}

void init(int n) {
    fac[0] = 1;
    for (int i = 1; i <= n; i++) {
        fac[i] = fac[i - 1] * i % MOD;
    }
    invfac[n] = ksm(fac[n], MOD - 2, MOD);
    for (int i = n - 1; i >= 0; i--) {
        invfac[i] = invfac[i + 1] * (i + 1) % MOD;
    }
}

i64 C(int n, int m) {  // 组合数
    if (m > n || m < 0) {
        return 0;
    }
    return fac[n] * invfac[m] % MOD * invfac[n - m] % MOD;
}

i64 A(int n, int m) {  // 排列数
    if (m > n || m < 0) {
        return 0;
    }
    return fac[n] * invfac[n - m] % MOD;
}

// n 对括号的合法匹配数,有 n 个节点的二叉树的种类数
// 从对角线下方走到对角线的路径数,栈的出栈序列数
i64 catalan(int n) {  // 卡特兰数
    if (n < 0) {
        return 0;
    }
    return C(2 * n, n) * ksm(n + 1, MOD - 2, MOD) % MOD;
}

// 将 n 个不同的元素划分到 k 个非空集合中的方案数
i64 stirling2(int n, int k) {  // 第二类斯特林数
    if (k > n || k < 0) {
        return 0;
    }
    i64 res = 0;
    for (int i = 0; i <= k; i++) {
        i64 term = C(k, i) * ksm(k - i, n, MOD) % MOD;
        if (i % 2 == 1) {
            term = (MOD - term) % MOD;
        }
        res = (res + term) % MOD;
    }
    return res * invfac[k] % MOD;
}

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

    init(N);
    int n;
    std::cin >> n;

    std::cout << catalan(n);
}

J-解题思路

nm只有16,dfs爆搜即可

J-代码实现

#include <bits/stdc++.h>

using i64 = long long;

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

    int n, m;
    std::cin >> n >> m;

    std::vector<std::vector<int>> a(n, std::vector<int>(m));
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            std::cin >> a[i][j];
        }
    }

    int ans = 0;
    std::vector<int> f(m);
    auto dfs = [&](auto &&self, int x, int cnt) -> void {
        if (x == n) {
            for (int i = 0; i < m; i++) {
                if (f[i] < 0) {
                    return;
                }
            }
            ans = std::max(ans, cnt);
            return;
        }
        self(self, x + 1, cnt);
        for (int i = 0; i < m; i++) {
            f[i] += a[x][i];
        }
        self(self, x + 1, cnt + 1);
        for (int i = 0; i < m; i++) {
            f[i] -= a[x][i];
        }
    };

    dfs(dfs, 0, 0);

    std::cout << ans;
}

标签:std,return,ZZJC,新生训练,int,题解,i64,ans,input
From: https://www.cnblogs.com/udiandianis/p/18568511

相关文章

  • 【题解】洛谷P5911 :[POI2004] PRZ
    状压dp,先预处理出来所以状态的重量和时间,然后枚举集合,然后枚举子集,子集重量合法的话就可以转移,因为这题是多个集合组成最后的集合。枚举子集。https://oi-wiki.org/math/binary-set/#__tabbed_1_1#include<bits/stdc++.h>#defineintlonglong#definelsp<<1#definersp......
  • easyui combobox 只能选择第一个问题解决
    easyuicombobox只能选择第一个问题解决问题现象在拆分开票的时候,弹出框上面有一个下拉框用于选择需要新增的明细行,但是每次只能选择到第一个选择第二条数据的时候默认选择到第一个了代码如下/*新增发票编辑窗口*/functionaddTicketDialog(){orderIte......
  • CF2023C C+K+S 题解
    前置知识:哈希/KMP题目链接:洛谷、Codeforces。有点牛的一道题。首先,既然两张图所有的环长都是\(k\)的倍数,那么考虑做一个比较厉害的处理:对图染色。令\(u\)的颜色为\(c_u\),如果有边\(u\rightarrowv\),那么\(c_v=(c_u+1)\modk\)。这样最多有\(k\)种颜色,范围是\(......
  • AtCoder ABC321F - #(subset sum = K) with Add and Erase 题解 可撤销背包
    题目链接:https://atcoder.jp/contests/abc321/tasks/abc321_f题目大意:给定大小为\(k\)的背包和\(q\)次操作,支持两种操作:插入一个大小为\(x\)的元素;删除一个大小为\(x\)的元素。每次操作后,求装满背包方案数。解题思路:可撤销背包。插入\(x\)时,fori=K->x......
  • 题解 - Game on Sum (Easy Version)
    题目,还是不挂洛谷。Alice镇楼题目大意Alice和Bob又在玩游戏。该种游戏共分为\(n\)轮,每轮中,先有一个数\(x=0\),Alice将选择\(t\isin[0,t_{max}]\),而B将会选择将\(x\)增加或减少\(t\)。在全部\(n\)轮中,B应至少有\(m\)次选择减少操作。Alice希望结......
  • 【题解】洛谷P11311、P2943: 漫长的小纸带、Cleaning Up G
    赛时不会去想dp,感觉没法转移,然后去写了贪心,然后直接假掉唐完了。为什么贪心不能做,因为多个数的话还是可能被减,\(3\)个数长度为\(11\)就可以变成\(9\),非常划算,好像很显然,但是为什么我赛时写了只会有长度\(2\)的区间唐完了。考虑dp,设\(f_i\)表示\(1-i\)的最小代价,枚举......
  • CF2038A - Bonus Project 题解
    题目传送门https://codeforces.com/contest/2038/problem/A先大致捋一下题目的含义一共有n个工程师,每个工程师完成相应的工作都有一定的奖金a,但同时也会消耗成本b,目前一共有k个工作需要做这些工程师对他们的同事很友好,他们能接受自己的总收益为0来增长经验,但不能接受自己为负......
  • 题解:[P11311 漫长的小纸带]
    P11311漫长的小纸带题意:有一个长度\(n\)的序列\(a\),将\(a\)分成若干段,使得所有段价值和最小,定义价值为一段内元素数量的平方。思路:显然能用动态规划来计算答案,设\(f[i]\)表示到第\(i\)个位置所获得的最小价值,考虑怎么转移。最直接的就是从\(1\)到\(i-1\)枚举断......
  • 读数据质量管理:数据可靠性与数据质量问题解决之道10数据平台
    1.      数据平台1.1.        让你能够从摄取数据到分析数据的整个过程中全面管理数据的技术组合1.2.        数据平台的要求随着业务的变化而变化1.3.        数据栈分为6层1.3.1.          数据摄取1.3.1.1.     ......
  • 读数据质量管理:数据可靠性与数据质量问题解决之道09数据可靠性
    1.      数据可靠性1.1.        数据可靠性指的是一个组织在整个数据生命周期中提供高数据可用性和健康状况的能力1.1.1.          是高数据质量带来的结果1.1.1.1.           高质量的大数据是这个大规模转型平台的核心1.1.2. ......