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 2i?1+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 a?x%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=a?inv(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} ni?1??ni?個(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
英文地址,請注明出處:http://en.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…