【藍橋杯】十五屆省賽B組c++

目錄

前言

握手問題

分析

排列組合寫法

枚舉

小球反彈

分析

代碼

好數

分析

代碼

R 格式

分析

代碼

寶石組合

分析

代碼

數字接龍

分析

代碼

拔河

分析

代碼

總結


前言

主播這兩天做了一套藍橋杯的省賽題目(切實感受到了自己有多菜)。


握手問題


分析

填空題的第一道,很簡單,不過主播第一次錯了(原因是把方案數的+想成了*,被自己蠢笑了)。

這道題如果有一些排列組合的基礎的話應該很容易想到答案就是7加到49

但這不代表沒有排列組合的基礎就不會,依然可以寫對這道題。(枚舉)


排列組合寫法

#include<iostream>
using namespace std;
int l;
?
int main()
{for(int i = 7; i <= 49; i++)l += i;cout << l;
}

枚舉

#include<iostream>
using namespace std;
int l;
int main()
{for(int i = 1; i <= 50; i++)for(int j = i + 1; j <= 50; j++){if(i <= 7 && j <= 7) continue; //選定七個人不握手l++;}cout << l;
}

小球反彈


分析

這道題主播依舊沒有寫出來()

物理題,首先將速度分解到xy兩個方向,隨后整個運動過程就可以看作在x軸上來回運動的同時y軸上來回運動

假設在x軸上經過a個來回y軸上經過b個來回回到原點,可得:
2ax/dx = 2by/dy

移項:
a/b = dx * y/ dy * x

隨后我們對a / b進行約分,即:a / gcd(a, b), b / gcd(a, b)

隨后再根據路程和速度即可得出:t = 2ax / dx

最后通過t * v求出路程。


代碼

#include<iostream>
#include<cmath>
using namespace std;
int x = 343720, y = 233333;
int dx = 15, dy = 17;
?
int gcd(int a, int b)
{if(b == 0) return a;return gcd(b, a % b);
}
int main()
{int a = y * dx, b = x * dy;a /= gcd(a, b); //約分double t = 2.0 * a * x / dx; //時間
?printf("%.2lf", t * sqrt(dx * dx + dy * dy));
?return 0;
}

好數


分析

觀察數據量——1e7枚舉每一位的話最大是7 * 1e7,小于1e8所以直接暴力枚舉計數即可。(這個主播最開始也是沒有想到,去寫模擬了)

代碼

#include<iostream>
using namespace std;
int l, n;
?
int main()
{scanf("%d", &n);for(int i = 1; i <= n; i++){int j = 1, k = i;l++;while(k){if((j & 1) != (k & 1)){l--;break;}j++;k /= 10;}}printf("%d", l);return 0;
}

R 格式


分析

發現n很大d也很大,所以考慮高精度

這道題主要考察了對浮點數的高精度寫法,可以在最開始忽略掉小數點,隨后進行累乘(高精度 * 低精度)再最后手動進位(高精度 + 低精度)

主播最開始還去寫了高精度*高精度QAQ,最后發現根本沒必要,真是蠢到家了。


代碼

#include<iostream>
#include <algorithm>
#include<vector>
using namespace std;
int n;
string l;
vector<int> A, B;
?
vector<int> cur(vector<int>& A, int b)
{int x = 0;vector<int> C;for(int i = 0; i < A.size(); i++){x += A[i] * b;C.push_back(x % 10);x /= 10;}while(x){C.push_back(x % 10);x /= 10;}return C;
}
?
vector<int> add(vector<int>& A, vector<int> B)
{int x = 0;vector<int> C;for(int i = 0; i < A.size() || i < B.size(); i++){if(i < A.size()) x += A[i];if(i < B.size()) x += B[i];C.push_back(x % 10);x /= 10;}if(x) C.push_back(1);return C;
}
?
int main()
{cin >> n >> l;for(int i = l.size() - 1; i >= 0; i--){if(l[i] == '.') continue;A.push_back(l[i] - '0'); //先不考慮小數點}for(int i = 1; i <= n; i++)A = cur(A, 2); //乘法計算.// 四舍五入int i = 0;for(; i < l.size(); i++)if(l[i] == '.') break; //找到小數點位置
?int x = 0;int d = l.size() - 1 - i; //小數部分reverse(A.rbegin(), A.rend()); //反轉for(int k = 0; k < l.size() - 1 - i; k++){x = A.back();A.pop_back();} //消除小數部分reverse(A.rbegin(), A.rend()); //反轉if(x >= 5)A = add(A, {1}); //進位for(int i = A.size() - 1; i >= 0; i--)printf("%d", A[i]);return 0;
}

寶石組合


分析

題意很簡單,這道題的主要難點就在于公式的推導。
S = H_aH_bH_c * LCM(H_a, H_b, H_c) / (LCM(H_a, H_b)*LCM(H_a, H_c)*LCM(H_b,H_c))

公式的推導有兩種方法,因為主播目前只熟悉一種所以就按照這個思路來講了。

公式推導基于算數基本定理

我們將每一項進行質因數分解可得到
H_a = p_1^{c_1} * p_2^{c_2} * ... p_n^{c_n}

同理將Hb于Hc分解質因數可得
H_a = p_1^{e_1} * p_2^{e_2} * ... p_n^{e_n}
H_a = p_1^{d_1} * p_2^{d_2} * ... p_n^{d_n}

我們按照質數進行因式分解,取出其中的一項可得:
p_1^{c_1} * p_1^{d_1} * p_1^{e_1} * p_1^{max(c_1, d_1, e_1)} / (p_1^{max(c_1, d_1)} * p_1^{max(c_1, e_1)} * p_1^{max(d_1, e_1)})

隨后我們消掉maxmin函數,設c1 > d1 > e1,可得:
p^{e_1}


e_1 = min(c_1, d_1, e_1)

滿足最大公因數的條件,我們最后將公式整合可得:
S = gcd(H_a, H_b, H_c)

至此我們完成了本道題的第一步

隨后我們來查找max(gcd(Ha, Hb, Hc))

顯然對于本道題直接枚舉的話會超時,如何來做呢?

可以發現H很小且gcd < H,所以我們可以直接枚舉約數


代碼

#include<iostream>
using namespace std;
const int N = 100010;
int n;
int a[N];
int main()
{scanf("%d", &n);for(int i = 1; i <= n; i++){int x; scanf("%d", &x);a[x]++; //存儲出現次數}for(int i = N - 1; i; i--) ? ? ? ? ? {int l = 0;for(int j = i; j < N; j += i)l += a[j];if(l >= 3){l = 0;for(int j = i; j < N && l < 3; j += i)for(int k = 0; k < a[j] && l < 3; k++, l++)printf("%d ", j);break;}}return 0;
}

數字接龍


分析

發現數據量很小所以直接搜索就好。

對于本道題的一個細節是如何判斷交叉

主播的建議是存儲一個這樣的值:read[x + dx][y + dy]

數組內的兩個參數是起始坐標終止坐標

這樣寫為什么是正確的呢?

因為只有斜著走的時候才有可能出現交叉的情況,所以每個方向的步長都是1

很容易發現兩個方向是一個奇數和一個偶數,和一定是一個奇數,而若將一個奇數分解為兩個相差為1的數字只有兩種情況(交換位置)。對于本道題來說正合適。所以寫一個這樣的數組就可以避免交叉。


代碼

#include <iostream>
#include <cstring>
#include <vector>
#define s second
#define f first
using namespace std;
typedef pair<int, int> PII;
const int N = 15;
int n, p;
int map[N][N];
vector<int> to[N][N]; //存儲能夠到達哪個點,顯著降低時間復雜度的小小小優化。
bool read[N][N];
bool cun[2 * N][2 * N]; //防止交叉
vector<int> vtr;
PII s[] = {{-1, 0}, {-1, 1}, {0, 1}, {1, 1}, {1, 0}, {1, -1}, {0, -1}, {-1, -1}}; //八個方向
?
bool dfs(int x, int y, int k)
{if(x == n && y == n && vtr.size() == n * n - 1){for(int i = 0; i < vtr.size(); i++)printf("%d", vtr[i]);return true;}if(x == n && y == n) return false;for(int i : to[x][y]){int dx = x + s[i].f, dy = y + s[i].s;if(read[dx][dy] == false) //第一層篩選{if(i & 1 == 0 || cun[x + dx][y + dy] == false) //無交叉{read[dx][dy] = true;if(i & 1) cun[x + dx][y + dy] = true;vtr.push_back(i);if(dfs(dx, dy, (k + 1) % p))return true;vtr.pop_back();if(i & 1) cun[x + dx][y + dy] = false;read[dx][dy] = false;}}}return false;
}
?
int main()
{memset(map, 0x3f, sizeof map);scanf("%d%d", &n, &p);for(int i = 1; i <= n; i++)for(int j = 1; j <= n; j++)scanf("%d", &map[i][j]);for(int i = 1; i <= n; i++)for(int j = 1; j <= n; j++)for(int k = 0; k < 8; k++){int dx = i + s[k].f, dy = j + s[k].s;if(map[dx][dy] == (map[i][j] + 1) % p)to[i][j].push_back(k); }read[1][1] = true;if(!dfs(1, 1, 1))printf("-1");return 0;
}

拔河


分析

最開始以為是dp但是后來發現我想多了。

題目要求兩個不相交的區間的差值最小,可以發現無論兩個區間又無相交情況差值都是不變的,所以問題就轉化成了差值最小的區間問題

套用模板——首先求出所有區間的和,隨后sort之后差值最小的必然會在相鄰的兩個區間上產生。當然對于本題需要考慮結果是否合法,即:一個區間不可以完全包含另一個區間。(使用區間取交集模板即可)


代碼

#include<iostream>
#include<vector>
#include<algorithm>
#define s second
#define f first
using namespace std;
typedef long long LL;
?
typedef pair<LL, pair<int, int>> PIII;
using namespace std;
const int N = 2010;
int n;
LL s[N];
vector<PIII> vtr; 
?
bool cmp(pair<int, int> A, pair<int, int> B)
{int x = max(A.f, B.f);int y = min(A.s, B.s); //查看有沒有交集return x == A.f && y == A.s || x == B.f && y == B.s;
}
?
int main()
{scanf("%d", &n);for(int i = 1; i <= n; i++){scanf("%lld", s + i);s[i] += s[i - 1];}LL cnt = 0x3f3f3f3f3f3f3f3f;for(int i = 1; i <= n; i++)for(int j = i; j <= n; j++)vtr.push_back({s[j] - ?s[i - 1], {i, j}});sort(vtr.begin(), vtr.end());for(int i = 1; i < vtr.size(); i++)if(!cmp(vtr[i].s, vtr[i - 1].s))cnt = min(cnt, vtr[i].f - vtr[i - 1].f);printf("%lld", cnt);return 0;
}

總結

最后附上ak截圖

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/75646.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/75646.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/75646.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

必刷算法100題之計算右側小于當前元素的個數

題目鏈接 315. 計算右側小于當前元素的 個數 - 力扣&#xff08;LeetCode&#xff09; 題目解析 計算數組里面所有元素右側比它小的數的個數, 并且組成一個數組,進行返回 算法原理 歸并解法(分治) 當前元素的后面, 有多少個比我小(降序) 我們要找到第一比左邊小的元素, 這…

Hyperlane框架:下一代高性能Rust Web框架 [特殊字符]

Hyperlane框架&#xff1a;下一代高性能Rust Web框架 &#x1f680; 引言 &#x1f44b; 在當今快速發展的Web開發領域&#xff0c;性能和開發效率的平衡變得越來越重要。Hyperlane作為一個新興的Rust Web框架&#xff0c;完美地解決了這個問題。本文將帶您深入了解Hyperlane…

圖像處理:使用Numpy和OpenCV實現傅里葉和逆傅里葉變換

文章目錄 1、什么是傅里葉變換及其基礎理論 1.1 傅里葉變換 1.2 基礎理論 2. Numpy 實現傅里葉和逆傅里葉變換 2.1 Numpy 實現傅里葉變換 2.2 實現逆傅里葉變換 2.3 高通濾波示例 3. OpenCV 實現傅里葉變換和逆傅里葉變換及低通濾波示例 3.1 OpenCV 實現傅里葉變換 3.2 實現逆傅…

OpenEuler/CentOS一鍵部署OpenGauss數據庫教程(腳本+視頻)

&#x1f4cc;OpenEuler/CentOS一鍵安裝OpenGauss數據庫教程 為什么需要OpenGauss一鍵安裝腳本&#xff1f; 手動部署OpenGauss數據庫時&#xff0c;環境適配、依賴沖突等問題常讓開發者頭疼。尤其對新人而言&#xff0c;官方文檔的配置步驟可能耗時數小時甚至引發未知報錯。 …

如何解決 Hive 在創建 MySQL 表時出現亂碼???的問題

1.問題描述 我們啟動Hive建立一個學生students表格 使用desc students;查看表格結構時 發現有出現亂碼的情況 2.解決方案 打開Hive安裝機器上面的MySQL 切換到Hive數據庫 執行以下命令修改字段注釋字符集 mysql -u root -p123456;use hive;alter table COLUMNS_V2 modify col…

自定義組件觸發餓了么表單校驗

餓了么的表單控件&#xff0c;如果存在自定義組件更改了值&#xff0c;例如在el-from中存在原生input組件很有可能沒法觸發表單校驗&#xff0c;下拉框或者彈框組件仍然是報紅邊框。 這是因為餓了么的輸入框或者下拉框更改值的時候會自動觸發表單校驗&#xff0c;但是封裝過后的…

架構思維:查詢分離 - 表數據量大查詢緩慢的優化方案

文章目錄 Pre引言案例何謂查詢分離&#xff1f;何種場景下使用查詢分離&#xff1f;查詢分離實現思路1. 如何觸發查詢分離&#xff1f;方式一&#xff1a; 修改業務代碼&#xff1a;在寫入常規數據后&#xff0c;同步建立查詢數據。方式二&#xff1a;修改業務代碼&#xff1a;…

Linux開發工具——make/makefile

&#x1f4dd;前言&#xff1a; 這篇文章我們來講講Linux開發工具——make/makefile&#xff1a; &#x1f3ac;個人簡介&#xff1a;努力學習ing &#x1f4cb;個人專欄&#xff1a;Linux &#x1f380;CSDN主頁 愚潤求學 &#x1f304;其他專欄&#xff1a;C學習筆記&#xf…

python加載訓練好的模型并進行葉片實例分割預測

要基于“GMT: Guided Mask Transformer for Leaf Instance Segmentation”進行代碼復現&#xff0c;可按照以下步驟利用Python實現&#xff1a; 環境配置 克隆倉庫&#xff1a;在終端中使用git clone https://github.com/vios-s/gmt-leaf-ins-seg.git命令&#xff0c;將項目代…

AI平臺初步規劃實現和想法

要實現一個類似Coze的工作流搭建引擎&#xff0c;可以結合SmartEngine作為后端工作流引擎&#xff0c;ReactFlow作為前端流程圖渲染工具&#xff0c;以及Ant Design作為UI組件庫。以下是實現的步驟和關鍵點&#xff1a; ### 1. 后端工作流引擎&#xff08;SmartEngine&#xf…

Pycharm 啟動時候一直掃描索引/更新索引 Update index/Scanning files to index

多個項目共用一個虛擬環境&#xff0c;有助于加快PyCharm 啟動嗎 chatgpt 4o認為很有幫助&#xff0c;gemini 2.5pro認為沒鳥用&#xff0c;我更認可gemini的觀點。不知道他們誰在一本正經胡說八道。 -------- 打開pycharm的時候&#xff0c;下方的進度條一直顯示在掃描文件…

dify新版本1.1.3的一些問題

本人使用window版本上構建dify&#xff0c;采用docker方法啟動 1、拉取鏡像問題 windows上更改拉取鏡像倉庫地址 優化加速參考&#xff1a;青春不留白/Docker-hub 如果還是拉取比較慢的話&#xff0c;建議科學上網解決。 2、啟動問題 發生報錯Dify:failed to init dify plu…

4.2-3 fiddler抓取手機接口

安卓&#xff1a; 長按手機連接的WiFi&#xff0c;點擊修改網絡 把代理改成手動&#xff0c;服務器主機選擇自己電腦的IP地址&#xff0c;端口號為8888&#xff08;在dos窗口輸入ipconfig查詢IP地址&#xff0c;為ipv4&#xff09; 打開手機瀏覽器&#xff0c;輸入http://自己…

Spring Boot中自定義注解的創建與使用

&#x1f31f; 前言 歡迎來到我的技術小宇宙&#xff01;&#x1f30c; 這里不僅是我記錄技術點滴的后花園&#xff0c;也是我分享學習心得和項目經驗的樂園。&#x1f4da; 無論你是技術小白還是資深大牛&#xff0c;這里總有一些內容能觸動你的好奇心。&#x1f50d; &#x…

2024第十五屆藍橋杯大賽軟件賽省賽C/C++ 大學 B 組

記錄刷題的過程、感悟、題解。 希望能幫到&#xff0c;那些與我一同前行的&#xff0c;來自遠方的朋友&#x1f609; 大綱&#xff1a; 1、握手問題-&#xff08;解析&#xff09;-簡單組合問題&#xff08;別人叫她 鴿巢定理&#xff09;&#x1f607;&#xff0c;感覺叫高級了…

HTML應用指南:利用POST請求獲取三大運營商5G基站位置信息(一)

在當前信息技術迅猛發展的背景下,第五代移動通信(5G)技術作為新一代的無線通信標準,正逐步成為推動社會進步和產業升級的關鍵驅動力。三大電信運營商(中國移動、中國聯通、中國電信)在全國范圍內的5G基站部署,不僅極大地提升了網絡性能,也為智能城市、物聯網、自動駕駛…

C++學習之線程

目錄 1.進程和線程的概念 2.線程內核三級映射 3.線程優缺點 4.創建線程和獲取線程ID的函數 5.創建子線程 6.循環創建N個子線程 7.子線程傳參地址錯誤演示分析 8.主、子線程共享全局變量、堆空間 9.線程退出 10.pthread join回收線程退出值 11.pthread_cancel 12.殺死…

element-plus中,表單校驗的使用

目錄 一.案例1&#xff1a;給下面的表單添加校驗 1.目的要求 2.步驟 ①給需要校驗的el-form-item項&#xff0c;添加prop屬性 ②定義一個表單校驗對象&#xff0c;里面存放了每一個prop的檢驗規則 ③給el-form組件&#xff0c;添加:rules屬性 ④給el-form組件&#xff0…

團體設計程序天梯賽L2-025 # 分而治之

文章目錄 題目解讀輸入格式輸出格式 思路Ac Code參考 題目解讀 在戰爭中&#xff0c;我們希望首先攻下敵方的部分城市&#xff0c;使其剩余的城市變成孤立無援&#xff0c;然后再分頭各個擊破。為此參謀部提供了若干打擊方案。本題就請你編寫程序&#xff0c;判斷每個方案的可…

Arduino示例代碼講解:Knock Sensor 敲擊感知器

Arduino示例代碼講解:Knock Sensor 敲擊感知器 Knock Sensor 敲擊感知器功能概述硬件部分:軟件部分:代碼逐行解釋定義常量定義變量`setup()` 函數`loop()` 函數工作原理Knock Sensor 敲擊感知器 這段代碼是一個Arduino示例程序,用于檢測敲擊聲。它通過讀取一個壓電元件(p…