2025年第十六届蓝桥杯软件赛省赛C/C++大学A组个人解题

news2025/5/14 15:27:46

文章目录

  • 题目A
  • 题目C:抽奖
  • 题目D:红黑树
  • 题目E:黑客
  • 题目F:好串的数目

https://www.dotcpp.com/oj/train/1166/

题目A

找到第2025个素数

#include <iostream>  
#include <vector>  
  
using namespace std;  
  
vector<int> primes = {2,3,5,7};  
void init_primes(int n) {  
    auto check_prime = [&](int x) {  
        return std::all_of(primes.begin(), primes.end(), [x](int p) {  
            return x % p != 0;  
        });  
    };  
    int ii = primes.size(), x = primes.back() + 2;  
    while (ii < n) {  
        if (check_prime(x)) primes.push_back(x), ++ii;  
        x += 2;  
    }  
}  
  
int main() {  
    init_primes(2025);  
    cout << primes.back() << endl;  
    return 0;  
}

题目C:抽奖

顾名思义

#include <iostream>  
#include <vector>  
#include <algorithm>  
  
using namespace std;  
  
typedef long long ll;  
  
vector<int> inputVecI(int n) {  
    vector<int> a(n);  
    for (int i = 0; i < n; ++i) {  
        cin >> a[i];  
    }  
    return a;  
}  
  
ll get_score(vector<int> &v) {  
    if ((v[0] == v[1] and v[1] == v[2]) or (v[0] + 1 == v[1] and v[1] + 1 == v[2])) return 200;  
//    ranges::sort(v);  
    std::sort(v.begin(), v.end());  
    if ((v[0] == v[1] or v[1] == v[2]) or (v[0] + 1 == v[1] and v[1] + 1 == v[2])) return 100;  
    return 0;  
}  
  
void solve() {  
    int n, m;  
    ll ans = 0;  
    cin >> n;  
    vector<int> a(n),b(n),c(n);  
    int ia = 0, ib = 0, ic = 0;  
    for (int i = 0; i < n; ++i) cin >> a[i];  
    for (int i = 0; i < n; ++i) cin >> b[i];  
    for (int i = 0; i < n; ++i) cin >> c[i];  
    cin >> m;  
    for (int i = 0; i < m; ++i) {  
        vector<int> v = inputVecI(3);  
        ia = (ia + v[0]) % n;  
        ib = (ib + v[1]) % n;  
        ic = (ic + v[2]) % n;  
        v[0] = a[ia], v[1] = b[ib], v[2] = c[ic];  
        ans += get_score(v);  
    }  
    cout << ans << endl;  
}  
  
int main() {  
    solve();  
    return 0;  
}

题目D:红黑树

对于一颗红黑树具有的性质是:

  • 下一层的左半行的颜色等于上一层。
  • 每一层右半行的颜色和左半行的颜色相反。
  • 左孩子和父结点颜色相同,右孩子和父节点颜色相反。

二叉树的性质
对于一颗00开始编号的二叉树(顶点从0开始编号,行号从0开始编号),具有以下性质:

   0
  1 2
3 4 5 6

其节点<i,j>(第i行,第j个)满足:

  • 编号等于 2 i − 1 + j 2^i-1+j 2i1+j
  • 其父节点是<i-1,[j/2]>。如果j是偶数则是左孩子,奇数则是右孩子。
#include <iostream>  
#include <vector>  
#include <algorithm>  
#include <stack>  
using namespace std;  
  
typedef long long ll;  

void solve() {  
    int n, m;  
    cin >> n >> m;  
    --n, --m;  
    /*  
     * 思路:回溯到根结点,再根据每次的孩子方向迭代颜色  
     * 优化:如果以0表示向左,1表示向右,则0--0 => 0, 0--1 => 1, 1--0==>0, 1--1 => 1。这其实就是异或运算。  
     *///    stack<int> trace, direction;  
    int color = 0;  
    while (n >= 0) {  
//        trace.push(n);  
//        direction.push(m & 1);  
        color ^= m & 1;  
        --n;  
        m >>= 1;  
    }  
    cout << (color ? "BLACK" : "RED") << endl;  
  
}  
  
int main() {  
    int t;cin>>t;  
    while (t--) solve();  
    return 0;  
}

题目E:黑客

题意
给一个长度为n+2的数组a,取a中的两个数作为矩阵长宽,求可以组合为多少种矩阵?

思路1:
我们二维的矩阵和它展开成一维是数组是1:1映射关系,因此我们只需要求,取两个长宽数后数组的排列数即可
首先将剩下的数组转为counter

枚举长宽,然后
根据排列组合原理计算排列数即可
例如我们有一个长度为9的数组

1 1 1, 2 2 2, 3, 4 4

它的排列数为
C 9 3 + C 6 3 + C 3 1 + C 2 2 C_{9}^{3} + C_{6}^{3} + C_{3}^{1} + C_{2}^{2} C93+C63+C31+C22

[!NOTE] 逆元
对于x满足 a ∗ x % p = 1 % p a*x\%p=1\%p ax%p=1%p,则称 x x x a a a的逆元(1逆元),记作 x = i n v ( a ) x=inv(a) x=inv(a)
如果我们把 % p \%p %p去掉,此时 x = 1 a x=\frac{1}{a} x=a1
模下除法必须用到1逆元
a b % p = a ∗ i n v ( b ) \frac{a}{b}\%p = a*inv(b) ba%p=ainv(b)

#include <iostream>  
#include <vector>  
#include <map>  
#include <algorithm>  
#include <cmath>  
using namespace std;  
//#define int long long  
typedef long long ll;  
const ll MOD = 1000000007;  
  
template<typename T>  
T next() {  
    T _;  
    cin >> _;  
    return _;  
}  
  
// 快速逆元(快速幂求逆元)  
ll quick_inv(ll a, ll b) {  
    ll res = 1;  
    while (b) {  
        if (b & 1) res = res * a % MOD;  
        a = a * a % MOD;  
        b >>= 1;  
    }  
    return res;  
}  
  
vector<ll> fac, inv;     // 阶乘查询数组,逆元查询数组  
void init_fac_and_inv(int n) {  
    fac = vector<ll>(n+1), inv = vector<ll>(n+1);  
    fac[0] = inv[0] = 1;  
    for (int i = 1; i < n; ++i) {  
        fac[i] = fac[i-1] * i % MOD;  
    }  
    inv[n-1] = quick_inv(fac[n-1], MOD-2);  // 用费马小定理求逆元  
    for (int i = n - 2; i >= 1; --i) {  
        inv[i] = inv[i+1] * (i + 1) % MOD;  
    }  
}  
  
  
// 求C(n,k) mod MOD  
ll quick_comb(ll n, ll k) {  
    if (k < 0 or k > n) return 0;  
    return fac[n] * inv[k] % MOD * inv[n-k] % MOD;  
}  
  
// 计算组合数  
/*ll combination(ll n, ll m) {  
    if (m > (n >> 1)) m = n - m;    ll res = 1;    for (ll i = 0; i < m; ++i) res *= n--;    while (m > 1) res /= m--;    return res;}  
map<pair<ll,ll>, ll> cache_combination; // 缓存  
ll comb(ll n, ll m) {  
    pair<ll,ll> nm = make_pair(n,m);    if (cache_combination.find(nm) != cache_combination.end()) return cache_combination[nm];//    ll res = combination(n, m) % MOD;  
    ll res = quick_comb(n, m) % MOD;    cache_combination[nm] = res;    return res;}*/  
  
// 计算一个counter的组合数  
ll comb_counter(const map<ll, ll> &counter, ll n) {  
    ll res = 1;  
    for (const auto &it: counter) {  
        // res *= comb(n, it.second);  
        res *= quick_comb(n, it.second);  
        n -= it.second;  
        res %= MOD;  
    }  
    return res;  
}  
  
void solve() {  
    ll n;  
    ll ans = 0;  
    cin >> n;  
    init_fac_and_inv((int)n);  
    map<ll, ll> counter;  
    for (ll i = 0; i < n; ++i) ++counter[next<ll>()];  
    /*  
     * 二维转一维,将矩阵看成是数组。  
     */    n -= 2;     // n 为数组的实际长度  
    // 枚举矩阵可能的形状(r行c列)  
    ll r_max = (ll) sqrt(n);  
    for (ll r = 1; r <= r_max; ++r) {  
//        ll r = it.first;  
        if (n % r) continue;    // 不能被整除  
        ll c = n / r;  
        if (r == c) {  
            if (counter[r] >= 2) counter[r] -= 2;  
            else continue;  
        } else {  
            if (counter[r] >= 1 and counter[c] >= 1) --counter[r], --counter[c];  
            else continue;  
        }  
//        printf_s("matrix: %d %d\n", r, c);  
        ans += (r == c ? comb_counter(counter, n) : comb_counter(counter, n) << 1); // 如果行列数不相等,我们把行列互换也可以得到一个相等的结果  
//        printf_s(">  %lld\n", (r == c ? comb_counter(counter, n) : comb_counter(counter, n) << 1));  
        ans %= MOD;  
        ++counter[r], ++counter[c];  
    }  
    cout << ans << endl;  
}  
  
int main() {  
//    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);  
    /*int t;cin>>t;    while (t--)*/ solve();  
    return 0;  
}

题目F:好串的数目

题意:
好串:能分割成2个非递减子串的串;长度为1的(1个字符)也是好串
给一个整数字符串,求它的子串是好串的数目。

思路:
排列组合原理
例如对于输入

1225568

我们先将它拆分成一个个非递减的子段

122 556 8

他们的长度分别是

3 3 1

对于这些子段:

  • 我们取它的任意一个子串都是好串
    • 例如对于122122 12 22 1 等都是好串。一共有 C n 2 C_{n}^2 Cn2个(n是子段长度)
  • 对于两个相邻的子段,我们将它们组合再掐头去尾,也是好串
    • 例如对于122 + 55612256 2556 等都是好串。一个有 n i − 1 ⋅ n i n_{i-1} \cdot n_{i} ni1ni个(n是子段长度)
#include <iostream>  
#include <vector>  
#include <algorithm>  
#include <stack>  
using namespace std;  
  
typedef long long ll;  
  
void solve() {  
    string s;  
    cin >> s;  
    vector<ll> a;  
    ll ls = s[0] - '0', cnt = 0, ans = 0;  
    for (char i : s) {  
        int cur = i - '0';  
        if (cur == ls or cur == ls + 1) ++cnt;  
        else a.push_back(cnt), cnt = 1;  
        ls = cur;  
    }  
    a.push_back(cnt);  
  
    for (int i = 0; i < a.size(); ++i) {  
        if (i > 0) ans += a[i] * a[i-1];  
        ans += a[i] * (a[i] + 1) / 2;  
    }  
    cout << ans << endl;  
}  
  
int main() {  
    /*int t;cin>>t;  
    while (t--)*/ solve();  
    return 0;  
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2375487.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从数据中台到数据飞轮:数字化转型的演进之路

从数据中台到数据飞轮&#xff1a;数字化转型的演进之路 数据中台 数据中台是企业为整合内部和外部数据资源而构建的中介层&#xff0c;实现数据的统一管理、共享和高效利用&#xff0c;目标是打破信息孤岛&#xff0c;提高数据使用效率&#xff0c;支持业务决策和创新 实施成本…

2025年5月-信息系统项目管理师高级-软考高项一般计算题

决策树和期望货币值 加权算法 自制和外购分析 沟通渠道 三点估算PERT 当其他条件一样时&#xff0c;npv越大越好

zst-2001 上午题-历年真题 算法(5个内容)

回溯 算法 - 第1题 找合适的位置&#xff0c;如果没有位置就按B回家 d 分治 算法 - 第2题 b 算法 - 第3题 a 算法 - 第4题 划分一般就是分治 a 算法 - 第5题 分治 a 0-1背包 算法 - 第6题 c 算法 - 第7题 最小的为c 3100 c 算法 - 第8题 …

udp多点通信和心跳包

刷题 # UDP多点通信核心要点## 基础通信模式### 单播通信- 一对一通信方式- UDP默认通信模式- 地址指向具体目标主机### 广播通信- 一对多通信机制- 地址范围&#xff1a;xxx.xxx.xxx.255- 仅限局域网传输- 需设置SO_BROADCAST标志### 组播通信- 多对多群组通信- 地址范围&…

音视频学习:使用NDK编译FFmpeg动态库

1. 环境 1.1 基础配置 NDK 22b (r22b)FFmpeg 4.4Ubuntu 22.04 1.2 下载ffmpeg 官网提供了 .tar.xz 包&#xff0c;可以直接下载解压&#xff1a; wget https://ffmpeg.org/releases/ffmpeg-4.4.tar.xz tar -xvf ffmpeg-4.4.tar.xz cd ffmpeg-4.41.3 安装基础工具链 sudo …

如何使用 Qwen3 实现 Agentic RAG?

今天&#xff0c;我们将学习如何部署由阿里巴巴最新Qwen 3驱动的Agentic RAG。 这里是我们的工具栈&#xff1a; CrewAI用于代理编排。 Firecrawl用于网络搜索。 LightningAI的LitServe用于部署。 顶部的视频展示了这一过程。 图表显示了我们的Agentic RAG流程&#xff1…

相机、雷达标定工具,以及雷达自动标定的思路

本篇我们来看一下自动驾驶传感器配置一个非常重要的模块&#xff0c;也就是传感器的标定。这里主要是对我之前修改的功能包的使用进行一个介绍. 对应的资源也已经上传了&#xff0c;0积分下载 安装 首先整个项目是使用ros1来进行启动的,但是要想正常编译,需要先安装三个对应的…

vsomeip环境搭建保姆级教程

vsomeip环境搭建保姆级教程 ubuntu环境搭建 {% links %} site: VMware搭建ubuntu保姆级教程 url: https://zhuanlan.zhihu.com/p/1903219373906327339 desc: flechazo image: https://q1.qlogo.cn/g?b=qq&nk=2861099&s=5 color: “#9d5b8b” {% endlinks %} vsomei…

我的MCP相关配置记录

1.VSCode的Cline中的MCP {"mcpServers": {"github.com/modelcontextprotocol/servers/tree/main/src/github": {"autoApprove": [],"disabled": false,"timeout": 60,"command": "cmd","args&quo…

我们来学nacos -- 集群nacos2.5.1mysql8.4

2.5.1集群搭建 架构下载解压到3个文件夹初始化数据库&数据迁移检查端口可用配置cluster.confapplication.properties 使用mysql8.4的jar启动db.num is null报错datasource错误成功 nginx反向代理集群查看 架构 其中包含3个nacos节点&#xff0c;然后一个负载均衡器代理3个…

Rollup入门与进阶:为现代Web应用构建超小的打包文件

我们常常面临Webpack复杂配置或是Babel转译后的冗余代码&#xff0c;结果导致最终的包体积居高不下加载速度也变得异常缓慢&#xff0c;而在众多打包工具中Rollup作为一个轻量且高效的选择&#xff0c;正悄然改变着这一切&#xff0c;本文将带你深入了解这个令人惊艳的打包工具…

专题四:综合练习( 找出所有子集的异或总和再求和)

以leetcode1863题为例 题目分析&#xff1a; 找到每个子集&#xff0c;然后子集中的元素异或之后全部相加 算法原理分析&#xff1a; 画决策树&#xff1a;第一层为这个子集有一个元素 第二层这个子集有两个元素 从上往下罗列&#xff0c;把所有子集都罗列出来&#xf…

STM32 修炼手册

第一章 计算机体系结构(了解) 后续在板子上开发的时候&#xff0c;需要考虑是否有操作系统 方式一&#xff1a;有操作系统&#xff0c;通过c库通过os api操作硬件方式二&#xff1a;无操作系统&#xff0c; 通过c库通过固件库操作硬件 第二章 STM32开发板概述 板子/开发板&…

缓存(2):数据一致性

概述 一致性就是数据保持一致,在分布式系统中,可以理解为多个节点中数据的值是一致的。 强一致性:这种一致性级别是最符合用户直觉的,它要求系统写入什么,读出来的也会是什么,用户体验好,但实现起来往往对系统的性能影响大弱一致性:这种一致性级别约束了系统在写入成功…

ppy/osu构建

下载 .NET (Linux、macOS 和 Windows) | .NET dotnet还行 构建&#xff1a;f5 运行&#xff1a;dotnet run --project osu.Desktop -c Debug

基于几何布朗运动的股价预测模型构建与分析

基于几何布朗运动的股价预测模型构建与分析 摘要 本文建立基于几何布朗运动的股价预测模型&#xff0c;结合极大似然估计与蒙特卡洛模拟&#xff0c;推导股价条件概率密度函数并构建动态预测区间。实证分析显示模型在标普500指数预测中取得89%的覆盖概率&#xff0c;波动率估…

python如何提取Chrome中的保存的网站登录用户名密码?

很多浏览器都贴心地提供了保存用户密码功能&#xff0c;用户一旦开启&#xff0c;就不需要每次都输入用户名、密码&#xff0c;非常方便。作为python脚本&#xff0c;能否拿到用户提前保存在浏览器中的用户名密码&#xff0c;用以自动登录呢&#xff1f;必须有&#xff0c;小爬…

Redis实现分布式获取全局唯一自增ID的案例。

【1】简易自增版本(从 1 开始 1,2,3&#xff0c;...) 项目结构 下面是一个基于 RedisTemplate 实现的分布式全局唯一自增 ID 生成器的案例。适用于 Java Spring Boot 环境&#xff0c;利用 Redis 的原子操作 INCR 指令。 ✅ 原理说明 Redis 提供的 INCR 命令是原子性的&…

人脸识别备案:筑牢人脸信息 “安全墙”

人脸识别备案制度主要依据《人脸识别技术应用安全管理办法》建立&#xff0c;人脸识别技术广泛应用于安防、金融、门禁、交通等领域&#xff0c;带来便利高效的同时&#xff0c;人脸信息安全问题也引发担忧。为规范技术应用、保护个人信息权益&#xff0c;人脸识别备案制度应运…

基于RT-Thread的STM32F4开发第三讲——DAC

文章目录 前言一、DAC是什么&#xff1f;二、RT-Thread工程创建三、DAC函数编写1.DAC.c2.DAC.h3.main.c 四、结果测试五、工程分享 前言 本章利用RT-Thread最新的驱动5.1.0开发DAC模块&#xff0c;使用的开发板是正点原子的STM32F4探索者。很多配置和上文重复&#xff0c;本文…