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

文章目录

  • 题目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开始编号),具有以下性质:

   01 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.pswp.cn/pingmian/80608.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/80608.shtml

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

相关文章

电机控制储备知识学习(一) 电机驱动的本质分析以及与磁相关的使用场景

目录 电机控制储备知识学习&#xff08;一&#xff09;一、电机驱动的本质分析以及与磁相关的使用场景1&#xff09;电机为什么能够旋转2&#xff09;电磁原理的学习重要性 二、电磁学理论知识1&#xff09;磁场基础知识2&#xff09;反电动势的公式推导 附学习参考网址欢迎大家…

JMeter同步定时器 模拟多用户并发访问场景

同步定时器 JMter同步定时器的作用主要在于模拟多用户并发访问的场景&#xff0c;确保多个线程能够同时执行某个操作&#xff0c;达到真正的并发效果。 当多个线程同时启动时&#xff0c;它们可能会在不同的时间间隔内执行&#xff0c;这样就无法达到真正的并发效果。&#xff…

C++11异步编程 --- async

C11异步编程 — async和future C11引入了async和future机制&#xff0c;用于简化异步编程和并发操作。这两个组件位于<future>头文件中&#xff0c;提供了高级的异步任务管理接口。 一、async 1.定义 std::async std::async是一个函数模板&#xff0c;用于启动一个异…

(七)深度学习---神经网络原理与实现

分类问题回归问题聚类问题各种复杂问题决策树√线性回归√K-means√神经网络√逻辑回归√岭回归密度聚类深度学习√集成学习√Lasso回归谱聚类条件随机场贝叶斯层次聚类隐马尔可夫模型支持向量机高斯混合聚类LDA主题模型 一.神经网络原理概述 二.神经网络的训练方法 三.基于Ker…

[Java实战]Spring Boot 整合 Swagger2 (十六)

[Java实战]Spring Boot 整合 Swagger2 &#xff08;十六&#xff09; 一、Swagger 的价值与痛点 为什么需要 API 文档工具&#xff1f; 开发阶段&#xff1a;前后端高效协作&#xff0c;实时验证接口测试阶段&#xff1a;提供标准化测试用例维护阶段&#xff1a;降低新人理解…

系统稳定性之上线三板斧

&#x1f4d5;我是廖志伟&#xff0c;一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》&#xff08;基础篇&#xff09;、&#xff08;进阶篇&#xff09;、&#xff08;架构篇&#xff09;清华大学出版社签约作家、Java领域优质创作者、CSDN博客专家、…

题海拾贝:P1833 樱花

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《题海拾贝》、《C修炼之路》 欢迎点赞&#xff0c;关注&am…

摆脱拖延症的详细计划示例

以下是一个以一周为周期&#xff0c;帮助你摆脱拖延症的详细计划示例&#xff0c;你可以根据自己的实际情况进行调整和完善。 --- # 摆脱拖延症一周计划 ## 一、计划目标 通过一系列有针对性的方法和行动&#xff0c;逐步克服拖延习惯&#xff0c;提高任务执行效率和自我管理…

实物工厂零件画图案例(上)

文章目录 滑台气缸安装板旋转气缸安装板张紧调节块长度调节块双轴气缸安装板步进电机安装板梯形丝杆轴承座 简介&#xff1a;案例点击此处下载&#xff0c;这次的这几个案例并没有很大的难度&#xff0c;练习这几个案例最为重要的一点就是知道&#xff1a;当你拿到一个实物的时…

【Nova UI】十六、打造组件库之滚动条组件(中):探秘滑块的计算逻辑

序言 在上篇文章中&#xff0c;我们完成了滚动条组件开发的前期准备工作&#xff0c;包括理论推导、布局规划和基础设置。现在&#xff0c;我们将把这些准备转化为实际代码&#xff0c;开启滚动条组件的具体开发之旅&#x1f31f;。我们会详细阐述如何实现各项功能&#xff0c…

laravel 使用异步队列,context带的上下文造成反序列化出问题

2025年5月8日17:03:44 如果你是单个应用&#xff0c;异步递交任务&#xff0c;是在应用内部使用&#xff0c;一般不会发生这样的问题 但是现在app项目是 app是一个应用&#xff0c;admin是一个应用&#xff0c;app吧为了接口性能吧异步任务丢给admin去执行&#xff0c;如果两个…

深入剖析 MyBatis 位运算查询:从原理到最佳实践

深入剖析 MyBatis 位运算查询&#xff1a;从原理到最佳实践 引言 在数据库设计中&#xff0c;位运算是一种高效存储和查询多选字段的常用技术。然而&#xff0c;在实际开发中&#xff0c;特别是在使用 MyBatis 这样的 ORM 框架时&#xff0c;位运算查询往往会遇到一些意想不到…

01 | 大模型微调 | 从0学习到实战微调 | AI发展与模型技术介绍

一、导读 作为非AI专业技术开发者&#xff08;我是小小爬虫开发工程师&#x1f60b;&#xff09; 本系列文章将围绕《大模型微调》进行学习&#xff08;也是我个人学习的笔记&#xff0c;所以会持续更新&#xff09;&#xff0c;最后以上手实操模型微调的目的。 (本文如若有…

代码随想录算法训练营第三十八天|动态规划part6(完全背包2)

322. 零钱兑换 题目链接&#xff1a; 322. 零钱兑换 - 力扣&#xff08;LeetCode&#xff09; 文章讲解&#xff1a; 代码随想录 思路&#xff1a; 确定递推公式&#xff1a; dp[j]min(dp[j],dp[j-coins[i]]1); 由于是完全背包 &#xff0c;所以遍历顺序是正序 还存在另一…

使用 ECharts GL 实现交互式 3D 饼图:技术解析与实践

一、效果概览 本文基于 Vue 3 和 ECharts GL&#xff0c;实现了一个具有以下特性的 3D 饼图&#xff1a; 立体视觉效果&#xff1a;通过参数方程构建 3D 扇形与底座动态交互&#xff1a;支持点击选中&#xff08;位移效果&#xff09;和悬停高亮&#xff08;放大效果&#xff…

Transformer Decoder-Only 参数量计算

Transformer 的 Decoder-Only 架构&#xff08;如 GPT 系列模型&#xff09;是当前大语言模型的主流架构&#xff0c;其参数量主要由以下几个部分组成&#xff1a; 嵌入层&#xff08;Embedding Layer&#xff09;自注意力层&#xff08;Self-Attention Layers&#xff09;前馈…

(自用)Java学习-5.8(总结,springboot)

一、MySQL 数据库 表关系 一对一、一对多、多对多关系设计外键约束与级联操作 DML 操作 INSERT INTO table VALUES(...) DELETE FROM table WHERE... UPDATE table SET colval WHERE...DQL 查询 基础查询&#xff1a;SELECT * FROM table WHERE...聚合函数&#xff1a;COUNT()…

【日撸 Java 三百行】Day 11(顺序表(一))

目录 Day 11&#xff1a;顺序表&#xff08;一&#xff09; 一、关于顺序表 二、关于面向对象 三、代码模块分析 1. 顺序表的属性 2. 顺序表的方法 四、代码及测试 拓展&#xff1a; 小结 Day 11&#xff1a;顺序表&#xff08;一&#xff09; Task&#xff1a; 在《数…

Spring Boot动态配置修改全攻略

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 无需重启应用&#xff0c;实时更新配置的终极指南 在微服务架构中&#xff0c;动态配置管理是提高系统灵活性的关键技术。本文将通过4种主流方案&#xff0c…

精益数据分析(55/126):双边市场模式的挑战、策略与创业阶段关联

精益数据分析&#xff08;55/126&#xff09;&#xff1a;双边市场模式的挑战、策略与创业阶段关联 在创业和数据分析的学习旅程中&#xff0c;我们持续探索不同商业模式的奥秘。今天&#xff0c;依旧怀揣着与大家共同进步的想法&#xff0c;深入研读《精益数据分析》&#xf…