https://hackmd.io/@LittlePants/Hyw_rueGK (新手村)
https://yuihuang.com/about (竹女黃惟甚麼都有的blog)
https://hackmd.io/@sa072686/cp/%2Fa- (完整的語法教學&演算法教學)
https://www.csie.ntu.edu.tw/~b98902112/cpp_and_algo/ (基礎語法&演算法)
https://sites.google.com/site/pcshic/zi-xun-pei-xun (板中教材)
https://hackmd.io/@CLKO/B18yT_i5Z?type=view
https://hackmd.io/@nehs-iced-7th/Hk9_m5KH_/https%3A%2F%2Fhackmd.io%2F%40nehs-iced-7th%2FSkut4WffY (實驗高中教材)
https://shiyu0318.github.io/2023/02/Sort-Algorithm/
(一堆排序演算法)
xt96VKTAqBmzpmXjkU_Q (競程基礎)
https://cp.wiwiho.me/
https://hackmd.io/@pr3pony/HysEHoYe8 (競程較難)
我正在看
https://github.com/orgs/HHSH-CYSH-WGSH-HSNU-Summer-Camp/repositories (github)
https://docs.google.com/spreadsheets/d/1vc8jznRk1LOc2ksLs3xvhtngfv4tB4XKsMmL-kpM5lA/edit?usp=sharing (題單)
CSES Sorting & Searching
Codeforces EDU Binary Search + Two Pointer
Introductory problems
https://www.youtube.com/playlist?list=PL_815psSzw1FATzqwJdWaWJHGcH4F6DUz (競程較難)
https://hackmd.io/@alanlai/Byh58hzIY/%2FJdtIMHaSR7GVzveIXOkkIg (競程進階技巧)
https://hackmd.io/@hackerifyouwant/BJQll0Kad (各種程式 EX:資安 機器學習)
https://gunjyo0817.github.io/2020/11/07/2020-SCIST-Security-Note-Web/ (資安)
i428 - 巴士站牌
https://zerojudge.tw/ShowProblem?problemid=i428
h081 - 程式交易
https://zerojudge.tw/ShowProblem?problemid=h081
f605 - 購買力
https://zerojudge.tw/ShowProblem?problemid=f605
g275-七言對聯
https://zerojudge.tw/ShowProblem?problemid=g275
e286-籃球比賽
https://zerojudge.tw/ShowProblem?problemid=e286
h026-猜拳
https://zerojudge.tw/ShowProblem?problemid=h026
j605-程式考試
https://zerojudge.tw/ShowProblem?problemid=j605
c290-秘密差
https://zerojudge.tw/ShowProblem?problemid=c290
i399.-數字遊戲
https://zerojudge.tw/ShowProblem?problemid=i399
b964-成績指標
https://zerojudge.tw/ShowProblem?problemid=b964
g595-修補圍籬
https://zerojudge.tw/ShowProblem?problemid=g595
f312-人力分配
https://zerojudge.tw/ShowProblem?problemid=f312
c294-三角形辨別
https://zerojudge.tw/ShowProblem?problemid=c294
當提到 C++ 中的向量(vector)時,它是標準模板庫(STL)中的一個容器,用於在連續的記憶體位置上儲存元素,並提供了方便的方法來操作這些元素、更進階的矩陣格式,可以完成矩陣沒辦法達到的新增元素等等……..其內建有許多特別功能與函式庫,是初學者要學的重要技巧之一。
以下是一個基本的 C++ 向量的使用示例和一些相關的操作:
首先:要先引入標頭檔<vector> <algorithm>(sort排序)
一開始可直接先引入萬用標頭檔<bits/stdc++.h>
可以把他想成一維陣列,其宣告為vector<型態>名子
會相等於int a[10][10]
但vector不需要先宣告其大小(解題陣列題目時自由許多)
固定存入資料:矩陣名={1,2,3,4,5}
添加元素至vector(矩陣無法做到的事)
名.push_back(元素)
sort 排序
sort(v.begin(), v.end());<algorithm>
輸出如下:
降序排列:
輸出如下:
排序字串 sort string (升序)
輸出如下:
排序 struct
輸出:
排序陣列的某部份
只想排列陣列前五項可以這樣做
輸出如下:
如果是用 vector 的話,就變成這樣寫,
如果你想排序第3筆到第5筆數值,其他數值不動,可以這樣寫,
(排序從std::sort第一個參數開始,直到(小於)第二個參數之前)
zerojudge i399:(數字遊戲)
https://zerojudge.tw/ShowProblem?problemid=i399
zerojudgei428:(巴士站牌)
https://zerojudge.tw/ShowProblem?problemid=i428
c290-秘密差
https://zerojudge.tw/ShowProblem?problemid=c290
思維:這題是要算出偶數數字總和與基數數字總和
想法:用Ceil函式取首位數字再利用取餘數把剩餘的數取出來
但後來解了很久都解不出來
才發現題目輸入的限制位數>1000
這是連long long interger都裝不下所以後來才知道要用字串的發想來解
可以用.length()的函數來算是幾位數
在判斷是不是二的倍數來區分偶數位相加和奇數位相加
再用ascii code *
讓位數-‘0’的動作來讓字元變數字
字串處理還要多加油!
c294-三角形辨別
https://zerojudge.tw/ShowProblem?problemid=c294
f312. 1. 人力分配
f605. 1. 購買力
h026. 202001_1 猜拳
b964. 第 1 題 成績指標
前置複習
二維陣列
zerojudgeb965:(矩陣轉換)
重點:
zerojudgeh027:(矩陣總和)
氣泡排序(Bubble Sort)
氣泡排序是一種簡單的排序演算法,它的原理是依序比較相鄰的兩個元素,如果前一個元素大於後一個元素,就交換它們的位置,重複進行直到排序完成。因為排序過程中較大的元素像氣泡一樣慢慢浮到數列的右端,所以叫氣泡排序。
實作步驟
定義一個氣泡排序函數,傳入參數分別為 待排序的數列 arr[] 和 數列長度 n。
使用兩層循環進行排序,外層循環表示排序的輪數,內層循環表示每輪比較的次數。
如果前一個元素大於後一個元素,則使用 swap() 交換它們的位置。
在主函數中宣告一個待排序的數列,並計算數列。
https://zerojudge.tw/ShowProblem?problemid=i399
二分搜尋法(Binary Search)是一種常用的搜尋演算法,主要用於在已排序的陣列或清單中快速尋找目標元素。它的工作原理是將目標值與陣列的中間元素進行比較,如果相等,則找到了目標元素;如果目標值小於中間元素,則在陣列的前半部分繼續搜尋;如果目標值大於中間元素,則在陣列的後半部分繼續搜尋。通過逐步將搜尋範圍縮小一半,最終可以找到目標元素或確定目標元素不存在於陣列中。
left
為陣列的起始索引,右邊界 right
為陣列的結束索引。left
小於等於 right
時,執行以下步驟:mid
,可以使用 mid = (left + right) // 2
。right = mid - 1
。left = mid + 1
。https://leetcode.com/problems/reverse-string/
https://leetcode.com/problems/reverse-words-in-a-string-iii/
甚麼是struct?
把很多變數包在一起
宣告結構把它當作一個型態
結構中所包含的變數稱為屬性
與struct主要不同之處→有限制存取(誰可以使用)
public ->內外子
private ->內
protected ->內子
沒寫 ->默認private
可否把member function 放外面?->要加前綴→(name)::
l 一個節點最多2個Children
l 只有一個Root
l Root到Leaf只能有一條路徑
順序:中 左 右
D L R
前序遍歷(Pre-Order Traversal)按照以下順序訪問節點:當前節點、左子樹、右子樹。具體而言,前序遍歷首先訪問根節點,然後遞歸地對左子樹進行前序遍歷,最後遞歸地對右子樹進行前序遍歷。
前序遍歷常見的應用場景:
順序:左 中 右
L D R
中序遍歷(In-Order Traversal)按照以下順序訪問節點:左子樹、當前節點、右子樹。
中序遍歷可能有用的場景:
順序:左 右 中
L R D
後序遍歷(Post-Order Traversal)按照以下順序訪問節點:左子樹、右子樹、當前節點。具體而言,後序遍歷先遞歸地對左子樹進行後序遍歷,然後遞歸地對右子樹進行後序遍歷,最後訪問當前節點。
後序遍歷常見的應用場景:
Leetcode 94. Binary Tree Inorder Traversal
https://leetcode.com/problems/binary-tree-inorder-traversal/
Leetcode 144. Binary Tree Preorder Travers
https://leetcode.com/problems/binary-tree-preorder-traversal/
Leetcode 145. Binary Tree Postorder Traversal
https://leetcode.com/problems/binary-tree-postorder-traversal/
Leetcode 100. Same Tree
https://leetcode.com/problems/same-tree/
101. Symmetric Tree
https://leetcode.com/problems/symmetric-tree/description/
104:Maximum Depth of Binary23https://leetcode.com/problems/maximum-depth-of-binary-tree/description/
#include <queue>
跟排隊一樣
先到的先出隊伍
FIFO (First In First Out)52x
C++ 中的 BFS(Breadth-First Search,廣度優先搜尋)是一種用於圖形或樹狀結構的搜尋演算法。BFS 以廣度優先的方式逐層擴展搜索,從起始節點開始,先訪問與起始節點直接相鄰的節點,然後再逐層訪問更遠的節點。
BFS 的特點是,它從起始節點開始逐層擴展,確保先訪問較近的節點,然後再訪問較遠的節點。這使得 BFS 可以用於許多應用,例如尋找最短路徑、連通性檢查、圖形遍歷等。
https://zerojudge.tw/ShowProblem?problemid=d767
https://leetcode.com/problems/binary-tree-zigzag-level-order-traversal/
102. Binary Tree Level Order Traversal
https://leetcode.com/problems/binary-tree-level-order-traversal/
Leecode 111:Minimum Depth of Binary
https://leetcode.com/problems/minimum-depth-of-binary-tree/description/
515. Find Largest Value in Each Tree Row
https://leetcode.com/problems/find-largest-value-in-each-tree-row/description/
Leecode 589. N-ary Tree Preorder Traversal
https://leetcode.com/problems/n-ary-tree-preorder-traversal/description/
Graph(DFS)
C++ 中的 DFS(Depth-First Search,深度優先搜尋)是一種用於圖形或樹狀結構的搜尋演算法。DFS 以深度優先的方式進行遍歷,從起始節點開始,一直沿著某一個分支遞歸地遍歷,直到達到最深的節點,然後回溯到上一層,繼續遍歷其他分支。
DFS 的特點是,它沿著某一個分支一直遞歸到最深的節點,然後再回溯到上一層。這使得 DFS 可以用於許多應用,例如尋找特定節點、圖形連通性檢查、拓撲排序等。
Leecode 111:Minimum Depth of Binary
https://leetcode.com/problems/minimum-depth-of-binary-tree/description/
515. Find Largest Value in Each Tree Row
https://leetcode.com/problems/find-largest-value-in-each-tree-row/description/
Leecode 589. N-ary Tree Preorder Traversal
https://leetcode.com/problems/n-ary-tree-preorder-traversal/description/
從第 i 個位置開始數len個
return type : string
string s1 = “123456789”;
string s2 = s1.substr(3, 5); // s2會變成 “45678”
i400. 2. 字串解碼
https://zerojudge.tw/ShowProblem?problemid=i400
(40%)
(100%)
j606. 2. 造字程式
https://zerojudge.tw/ShowProblem?problemid=j606
貪心演算法的基礎是指凡事都先選擇最佳路徑,而每次都選擇最佳解最後的結果也剛好是最佳解。
今天,你走進一間便利商店,你總共買了總價錢為新台幣 456 元的商品,不過你手邊剛
好沒有足夠的零錢,只有一張 1000 元紙鈔。請問店員最少要拿多少鈔票與硬幣才能完成找錢?
假設今天某國其
硬幣面額為1 7 9
今天要湊出15元可
一貪心法從大往小找的邏輯可能會是9 1*6
單真正最少的硬幣配對方式卻會是7*2 1
貪心真的是對的嗎?
從上面那個例子,我們可以知道,靠著直覺走,貪心的做法並不會每次皆是正確的
那我們又為什麼需要使用這樣子的方式呢?
貪心演算法雖然不見得是正確的,但通常比起一般的作法來得更有效率
在本堂課的最後,會教大家一些證明演算法正確性的方式
觀察
觀察題目的情境,看看有什麼是我們策略是我們可以照著做的,並試著猜測看看
此步驟通常是最關鍵的一步,在簡單的題目中,貪心策略通常滿直覺的
找找看有沒有排序 queue set 等
找找看有沒有特殊關係(倍數)(大到小)(交換)
嘗試
觀察完題目後,得到了我們猜測的策略。我們可以試著想想各種不同的情況或測 資,試著去尋找是否有能使該策略產生錯誤答案的可能性
試試random case 手生case edge case
驗證
實際的使用數學證明,嚴謹的去證明該算法的正確性
此步驟十分重要,但是在比賽中,許多人會省略這個步驟,直接 Proof By AC
不過建議大家,即使在比賽中猜測出了正確做法,還是可以自己練習證明看看
活動安排問題 https://cses.fi/problemset/task/1629
最經典的貪心法題目:
題目給你一些電影播放時段長度並要你找出在時間內不重複的最多電影數量
資料:
5 貪心法 (Greedy)
「面對一個問題,不斷地使用同一個策略做事。」
貪心法可以很單純,也可以很懸,這裡提到所謂的「策略」也有可能會是很不直觀的做
法。
常常某些題目會讓人很直覺的想使用貪心的策略,等到中途才發現自己完全走錯了路,所
以通常我們在寫貪心的時候,會特別去注意這個做法是否是對的,可惜的是這是需要花時
間練習的。
5.1 證明貪心的思路
如果你提出了一個貪心做法,卻又很不確定他是不是對的,你可以朝以下幾個方向去思
考:
IX
板中資培-2 基礎演算法 1
5.3 題外話– Weighted Matroid
這東西似乎不是很實用,但他是一個貪心法相關的模塊。大致上就是在說,如果你有辦法
把一個問題歸約到他身上,就一定存在一個固定且有效的貪心法可以得出最佳解。
有興趣的話可以自己上網搜尋,不過中文好像沒什麼資源就是。
5.4 習題
貪心演算法的基礎是指凡事都先選擇最佳路徑,而每次都選擇最佳解最後的結果也剛好是最佳解。
今天,你走進一間便利商店,你總共買了總價錢為新台幣 456 元的商品,不過你手邊剛
好沒有足夠的零錢,只有一張 1000 元紙鈔。請問店員最少要拿多少鈔票與硬幣才能完成找錢?
假設今天某國其
硬幣面額為1 7 9
今天要湊出15元可
一貪心法從大往小找的邏輯可能會是9 1*6
單真正最少的硬幣配對方式卻會是7*2 1
貪心真的是對的嗎?
從上面那個例子,我們可以知道,靠著直覺走,貪心的做法並不會每次皆是正確的
那我們又為什麼需要使用這樣子的方式呢?
貪心演算法雖然不見得是正確的,但通常比起一般的作法來得更有效率
在本堂課的最後,會教大家一些證明演算法正確性的方式
觀察
觀察題目的情境,看看有什麼是我們策略是我們可以照著做的,並試著猜測看看
此步驟通常是最關鍵的一步,在簡單的題目中,貪心策略通常滿直覺的
找找看有沒有排序 queue set 等
找找看有沒有特殊關係(倍數)(大到小)(交換)
嘗試
觀察完題目後,得到了我們猜測的策略。我們可以試著想想各種不同的情況或測 資,試著去尋找是否有能使該策略產生錯誤答案的可能性
試試random case 手生case edge case
驗證
實際的使用數學證明,嚴謹的去證明該算法的正確性
此步驟十分重要,但是在比賽中,許多人會省略這個步驟,直接 Proof By AC
不過建議大家,即使在比賽中猜測出了正確做法,還是可以自己練習證明看看
活動安排問題 https://cses.fi/problemset/task/1629
最經典的貪心法題目:
題目給你一些電影播放時段長度並要你找出在時間內不重複的最多電影數量
資料:
5 貪心法 (Greedy)
「面對一個問題,不斷地使用同一個策略做事。」
貪心法可以很單純,也可以很懸,這裡提到所謂的「策略」也有可能會是很不直觀的做
法。
常常某些題目會讓人很直覺的想使用貪心的策略,等到中途才發現自己完全走錯了路,所
以通常我們在寫貪心的時候,會特別去注意這個做法是否是對的,可惜的是這是需要花時
間練習的。
5.1 證明貪心的思路
如果你提出了一個貪心做法,卻又很不確定他是不是對的,你可以朝以下幾個方向去思
考:
IX
板中資培-2 基礎演算法 1
5.3 題外話– Weighted Matroid
這東西似乎不是很實用,但他是一個貪心法相關的模塊。大致上就是在說,如果你有辦法
把一個問題歸約到他身上,就一定存在一個固定且有效的貪心法可以得出最佳解。
有興趣的話可以自己上網搜尋,不過中文好像沒什麼資源就是。
5.4 習題
基本程式概念
競程筆記
c++
C++`