牛客周赛 Round 59(下)

ops/2024/11/13 9:52:43/

逆序数

题目描述

登录—专业IT笔试面试备考平台_牛客网

运行代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{ll n,k;cin>>n>>k;ll sum=(n*(n-1))/2;cout<<sum-k<<endl;return 0;
}

代码思路

  1. 组合数的计算:在数学中,从 n 个不同元素中选取 m 个元素的组合数记为 C(n,m),计算公式为 C(n,m)=n!/(m!(n - m)!)。当 m = 2 时,即 C(n,2)=n*(n - 1)/2,这是因为 n! 中分子部分是 n*(n - 1)*(n - 2)!,而 2! = 2*1,约分后得到 n*(n - 1)/2

  2. 整体逻辑:首先根据输入的 n 计算出 n 个不同元素中选两个元素的组合数 sum。然后减去给定的 k 值,得到最终的结果并输出。这个结果可能代表在某种特定情境下,除去特定的 k 种情况后,剩余的组合数量。

构造mex

题目描述

登录—专业IT笔试面试备考平台_牛客网

运行代码

#include <iostream>
using namespace std;#define ll long longconst int mod = 998244353;void solve() {ll n, m, k;cin >> n >> m >> k;if (k == 0) {if (n < m) {cout << "NO\n";} else {cout << "YES\n";for (int i = 1; i < m; i++) {cout << "1 ";}cout << n - m + 1 << "\n";}} else if (k == 1) {if (n == 1 || m == 1) {cout << "NO\n";} else {cout << "YES\n";cout << n << " ";for (int i = 1; i < m; i++) {cout << "0 ";}cout << "\n";}} else {ll nd = (k) * (k - 1) / 2;if (nd > n || k > m) {cout << "NO\n";} else {ll lst = n - nd;if (k == m) {if (lst == 0) {cout << "YES\n";for (int i = 0; i < k; i++) {cout << i << " ";}cout << "\n";} else {cout << "NO\n";}} else if (lst == k) {if (m >= k + 2) {cout << "YES\n";cout << 1 << " " << lst - 1 << " ";for (int i = 0; i < k; i++) {cout << i << " ";}ll ss = m - k - 2;for (int i = 0; i < ss; i++) {cout << "0 ";}cout << "\n";} else {cout << "NO\n";}} else if (m >= k + 1) {cout << "YES\n";cout << lst << " ";for (int i = 0; i < k; i++) {cout << i << " ";}ll ss = m - k - 1;for (int i = 0; i < ss; i++) {cout << "0 ";}cout << "\n";} else {cout << "NO\n";}}}
}int main() {ios::sync_with_stdio(false);cin.tie(0);int tn;cin >> tn;while (tn--) {solve();}return 0;
}

代码思路

  1. 定义了一些常量和变量,包括 mod 用于取模运算,nmk 用于存储输入的数值,nd 用于计算特定的数值,lst 用于存储计算后的结果。
  2. solve 函数是核心函数,用于解决问题。
    • 当 k == 0 时,如果 n < m,则输出 "NO";否则,输出 "YES",并输出 m - 1 个 1 和一个 n - m + 1
    • 当 k == 1 时,如果 n == 1 或 m == 1,则输出 "NO";否则,输出 "YES",并输出一个 n 和 m - 1 个 0
    • 当 k > 1 时,计算 nd = (k) * (k - 1) / 2,如果 nd > n 或 k > m,则输出 "NO";否则,计算 lst = n - nd
      • 如果 k == m 且 lst == 0,则输出 "YES" 并输出 0 到 k - 1 的序列。
      • 如果 lst == k 且 m >= k + 2,则输出 "YES" 并按照特定格式输出序列。
      • 如果 m >= k + 1,则输出 "YES" 并按照另一种特定格式输出序列。
      • 否则,输出 "NO"
  3. 在 main 函数中,通过 ios::sync_with_stdio(false) 和 cin.tie(0) 进行输入输出流的优化。然后读取测试用例的数量 tn,并在循环中调用 solve 函数进行处理。

小红的X型矩阵

题目描述

登录—专业IT笔试面试备考平台_牛客网

运行代码

#include <iostream>
#include <vector>
#include <algorithm>
#define int long long
#define endl '\n'
const int N = 1010;
const int MOD = 1e9 + 7;void solve() {int n;std::cin >> n;std::vector<std::vector<int>> num(n, std::vector<int>(n));std::vector<int> h(n, 0);std::vector<int> l(n, 0);int cnt = 0;for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {std::cin >> num[i][j];if (num[i][j]) {cnt++;h[(i + j) % n]++;l[(i - j + n) % n]++;}}}int mint = 1e9;if (n % 2 == 1) {for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {int temp = h[(i + j) % n] + l[(i - j + n) % n];if (num[i][j]) temp--;int k = (2 * n - 1 - temp) + (cnt - temp);mint = std::min(mint, k);}}} else {for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {int temp = h[(i + j) % n] + l[(i - j + n + 1) % n];int k = (2 * n - temp) + (cnt - temp);mint = std::min(mint, k);}}}std::cout << mint << endl;
}signed main() {std::ios::sync_with_stdio(0);std::cin.tie(0);int t = 1;while (t--) solve();return 0;
}

代码思路

一、整体思路

  1. 定义问题规模和常量:N表示矩阵的最大尺寸,这里设置为 1010。MOD是一个常量,可能用于某些计算中的取模操作,设置为 1e9 + 7。

  2. 定义solve函数来解决问题:

    • 读入整数n,表示矩阵的边长。
    • 创建一个二维向量num来存储输入的矩阵,同时创建两个长度为n的向量hl,分别用于统计特定方向上的元素数量。
    • 通过双重循环遍历输入矩阵,对于每个位置(i, j):读入矩阵元素num[i][j]。如果该元素为非零值,则增加计数变量cnt,并更新hl向量中对应位置的值。具体来说,通过(i + j) % n(i - j + n) % n的计算结果来确定在hl向量中的位置,并将对应位置的值加一。
    • 初始化变量mint为一个较大的值(1e9)。
    • 如果n是奇数:通过三重循环遍历矩阵的每个位置(i, j)。计算变量temp,它是对应位置在hl向量中的值之和,如果当前位置的矩阵元素为非零值,则减一。计算变量k,根据特定的公式(2 * n - 1 - temp) + (cnt - temp)。更新mintmintk的较小值。
    • 如果n是偶数:与奇数情况类似,通过三重循环遍历矩阵的每个位置(i, j)。计算变量temp,这里的计算方式略有不同,使用(i - j + n + 1) % n来更新l向量中的位置。计算变量k,公式为(2 * n - temp) + (cnt - temp)。更新mintmintk的较小值。
    • 最后输出mint,即最小的操作次数。
  3. main函数中:设置输入输出流的同步,并初始化随机数生成器。读入整数t,表示测试用例的数量,这里固定为 1。调用solve函数来解决问题。

二、原理说明

  1. hl向量的作用:h向量用于统计矩阵中沿着特定对角线方向(通过(i + j) % n确定)上的非零元素数量。l向量用于统计矩阵中沿着另一个对角线方向(通过(i - j + n) % n(i - j + n + 1) % n确定,取决于n的奇偶性)上的非零元素数量。

  2. 计算最小操作次数的原理:

    • 对于奇数n和偶数n,分别采用不同的计算公式来计算最小操作次数。
    • 计算公式中的各个部分分别代表不同的含义:2 * n - 1 - temp2 * n - temp可能表示在某种情况下需要进行的操作次数,与矩阵的大小和当前状态有关。cnt - temp可能表示另一部分操作次数,与非零元素的总数和当前状态下特定方向上的非零元素数量有关。
    • 通过遍历矩阵的所有位置,计算每个位置对应的操作次数,并取最小值作为最终的结果。

http://www.ppmy.cn/ops/108131.html

相关文章

设计模式之状态模式 (C++ 实现)

设计模式是软件开发中的一项重要技能&#xff0c;它提供了一种通用的解决方案以应对不同的设计问题。状态模式是一种行为型设计模式&#xff0c;适用于对象在不同状态下表现出不同的行为。通过实现状态模式&#xff0c;可以让代码更清晰、更易扩展与维护。本文将通过C实现状态模…

Spring6梳理7——依赖注入之特殊类型属性

目录 ①字面量赋值 ②null值 ③xml实体 ④CDATA节 ①字面量赋值 什么是字面量&#xff1f; int a10; 字面量是在源代码中用来表示固定值的表示法。几乎所有的计算机编程语言都支持基本值的字面量表示&#xff0c;例如整数、浮点数和字符串。许多语言还支持布尔类…

在亚马逊云科技上利用Agent和生成式AI写小说(下篇)

今天小李哥将继续介绍亚马逊推出的国际前沿人工智能AI大模型平台Amazon Bedrock上的Agent的功能。我们将利用Agent结合应用代码工作流服务Step Functions创建链式提示词&#xff08;Prompt Chaining&#xff09;&#xff0c;通过提示词执行一系列调用Amazon Bedrock上AI大模型的…

Scikit-learn与TensorFlow哪个好

Scikit-learn 和 TensorFlow 是两款非常流行的机器学习库&#xff0c;但它们适合的使用场景不同&#xff0c;取决于任务的复杂性和需求。让我们比较一下它们的特点&#xff0c;帮助你选择合适的工具。 1. Scikit-learn Scikit-learn 是一个经典的机器学习库&#xff0c;主要用…

C++:类与对象

一、面向对象编程 (一) 面向过程vs面向对象 面向过程&#xff08;Procedural-Oriented-Programming&#xff0c; POP&#xff09;和面向对象&#xff08;Object-Oriented-Programming&#xff0c;OOP&#xff09;&#xff0c;是两种典型的编程范式&#xff0c;通常是作为划分编…

深入理解Docker核心原理:全面解析Docker Client

随着云计算与容器技术的飞速发展&#xff0c;Docker已经成为软件开发、部署和运维中的重要工具之一。在Docker的架构中&#xff0c;Docker Client作为用户操作Docker系统的接口&#xff0c;起着至关重要的作用。本文将详细解析Docker Client的核心原理、工作机制、常用命令以及…

jenkins工具的介绍和gitlab安装

使用方式 替代手动&#xff0c;自动化拉取、集成、构建、测试&#xff1b;是CI/CD持续集成、持续部署主流开发模式中重要工具&#xff1b;必须组件 jenkins-gitlab&#xff0c;代码公共仓库服务器&#xff08;至少6G内存&#xff09;&#xff1b;jenkins-server&#xff0c;需…

lodash

下载npm i lodash //数据二次处理 const monthGroup useMemo(() > {//return 出去计算后的值return _.groupBy(billList, item > dayjs(item.date).format(YYYY-MM)) }, [billList]) 拿到当前月份 //单日统计列表 const dayGroup useMemo(() > {const group _.g…