演算法小社課之零
By 做簡報做到凌晨02:37的 佑佑
可是我們還在C++語法欸
這樣算演算法嗎
講師介紹

807
大學術長
超強電神
殭屍介紹

失蹤世宗
這張真的很像殭屍
強電神
講師介紹
這我佑佑
啊我不是比耶那個欸那個是准哥
強墊神

今天要教什麼
- 介紹演算法
- 程式編輯器
- 編譯器
- online judge
- c++基本架構
- 變數
- 陣列
- 輸入
- 運算子
- 條件
- 迴圈
- 排版
- 題單
我覺得這裡好空喔所以放個創「世」紀

演算法?
要幹嘛?
什麼是演算法
- 演算法是計算機科學非常重要的基礎科目。簡單來說,演算法就是用電腦算數學的學問(古代人用算盤算、現代人用電腦算),可以說是數學科目。
- 想要解決現實生活當中的各種問題,計算機科學家就把現實問題對應到數學問題,然後設計公式、把公式寫成程式,讓電腦執行程式計算答案 ── 這些公式就叫做演算法了。
- 儘管這裡用了「公式」這個字眼來形容演算法,然而並不是各位印象中的數學公式。由於電腦能夠執行繁複的計算,所以公式可以設計成好幾十行、好幾百行,甚至用到很多數學理論。
競程 aka 競賽程式
用程式打競賽
解決各種問題 包括:
- 排序與查詢
- 貪心
- 動態規劃 分治
- 圖論
- 數論
- 資料結構
- 還有很多很多很多很多很多很多講師不會的
打競程可以幹嘛
做學習歷程- 考APCS?
- 很多大學資工都有APCS組 ex: 台清交
- APCS成績不差(44 or 43)就能透過這個申請大學
- 有大學讀?
- 可以保送?
競程打怪路線圖
校內能競建中9月北一6月
北市賽11月(一二等獎10人進全國賽)
全國賽 12月(一二等獎10人進選訓)
選訓一階3月(前半保送資工)
選訓二階4月
IOI 7月(金銀保送任意科系 好遠)
1, 6, 10月APCS or 1月海選
3月TOI初選
支線任務 | |
---|---|
YTP | 團體賽 好吃 好賺 有專題競賽 很多錢 |
ISSC | 團體賽 學長說不推 |
NPSC | 團體賽 獎品讚 建中條款(每校晉級3組) |
APIO
10人
10人
10人
12人
4人
20人
編輯程式碼?
文字編輯器
高度自定義
都要自己安裝
輕量化
IDE
整合式開發環境
安裝方便
吃效能
兩種工具
文字編輯器
IDE
兩種工具






編譯器
- 我們看得懂的東西 → 電腦看得懂的東西
-
高階語言 →→ 低階語言(執行檔)
-
直譯器
什麼是編譯器
- 基本上只有文字編輯器需要額外裝這個,IDE會直接幫你裝好
如何安裝編譯器
線上評測系統!
Online Judge
# Online Judge
OJ具體是什麼
線上評測系統
一個讓你練習程式設計與演算法的地方
會在後端有個伺服器執行你上傳的程式
對於特定的題目會有特定的輸入與輸出
如果你的程式輸入後的輸出與標準一樣
就會得到AC的結果la欸我字數都一樣欸
上面這段十七言絕句出自我們的世宗喔
# Online Judge
常見的OJ
- zerojudge:台灣最大,題目有點參差不齊,個人不常用
- TIOJ:建中資訊社維護的,都是難題
- codeforce:世界最大oj,常常有比賽,但都在台灣時間半夜
- Atcoder:第二大oj,在日本,比賽時間比較適合台灣人
- cses:很多演算法裸題可以練習 我推的oj
- neoj:資訊之芽的oj
基本上不存在所謂檢索功能
建北電資OJ
https://iscoj.fg.tp.edu.tw/
# Online Judge
OJ答案結果
AC(accepted) 你通過了
WA(wrong answer) 你錯了
MLE(memory limit exceed) 你花了太多記憶體
TLE(time limit exceed) 你花了太多時間
CE(compile error) 你的程式編譯失敗
RE(runtime error) 你戳到不能戳的記憶體
SYSTEM ERROR 你爛了 就這樣 去問出題者
示範時間
C++程式的基本架構
#include<iostream>
using namespace std;
int main(){
cout<<"Hello World!\n";
}
# 你第一次寫程式
引入函式庫
#include<標頭檔>
萬用標頭檔: bits/stdc++.h
#include<iostream>
using namespace std;
int main(){
cout<<"Hello World!\n";
}
# 你第一次寫程式
使用命名空間
標準函式庫(standard)
#include<iostream>
using namespace std;
int main(){
cout<<"Hello World!\n";
}
# 你第一次寫程式
主函式
函式是什麼之後再說
總之他是程式
開始跟結束的地方
#include<iostream>
using namespace std;
int main(){
cout<<"Hello World!\n";
}
# 你第一次寫程式
輸出
輸出 Hello World! 後
換行
#include<iostream>
using namespace std;
int main(){
cout<<"Hello World!\n";
}
# 你第一次寫程式
跳脫字元
\n代表換行
n換成不同東西有不同效果
#include<iostream>
using namespace std;
int main(){
cout<<"Hello World!"<<endl;
}
# 你第一次寫程式
endl換行
啊就,也是換行
'\n' 和 endl 的差別
- 比endl快
- 競程用
'\n'
endl
- 清空緩衝區
- 專案用
# CHAPTER 2
變數
Variable
- 資料暫存
- 不是
未知數 - 資料型態、變數名稱
變數
# 變數 variable
- 變數的類別
- 管理運算方式、記憶體分配
資料型態
# 資料型態
常見資料型態
資料型態 | 用途 | 記憶體大小 |
---|---|---|
int | 整數-2³¹~2³¹-1(約2*10⁹~-2*10⁹) | 4 bytes |
long long | 更大的整數 -2⁶³~2⁶³-1(約9*10¹⁸~-9*10¹⁸) | 8 bytes |
float | 浮點數 (可以有小數點的數字) | 4 bytes |
double | 更精確浮點數 (可以有小數點的數字) | 8bytes |
char | 字元 | 1 byte |
string | 字串 | 可變 |
# 資料型態
-
與變數意義相關
-
只能用大小寫字母、數字、
_
、$
-
數字不可作為變數名稱的開頭
-
大小寫意義不同
-
不可使用保留字
變數命名
# 變數 variable
保留字
- 給編譯器特殊判定用
- 不可作為變數名稱
# 保留字
保留字
建電大社課同款圖片

# 保留字
變數宣告
資料型態 變數名稱;
資料型態 變數名稱=初始值;
資料型態 變數名稱, 另一個變數名稱;
int a;
int b=7;
int c=5,d=3,e,f,g;
# 變數 variable
飯粒扣
#include<iostream>
using namespace std;
int main(){
string name;
int score;
cin >> name >> num;
cout << "HelloWorld\n";
cout << "I'm " << name << '\n';
cout << "My test score is " << num << '\n';
cout << "._.";
}
# 變數 variable
飯粒輸出

# 變數 variable
陣列
Array
- 一串變數
- 一串暫存資料的空間
陣列
0 | 1 | 2 | 3 | 4 | 5 | 6 |
---|
0-base喔各位
# 陣列 array
陣列宣告
資料型態 變數名稱[陣列長度];
資料型態 變數名稱[]={初始值1,初始值2,初始值3};
資料型態 變數名稱[陣列長度], 另一個變數名稱[陣列長度];
int a[5];
int b[]={3,7,9,2};
int c[]={5};
# 陣列 array
陣列取值
#include<bits/stdc++.h>
using namespace std;
int main(){
int arr[]={1,5,8,3,4,5,7};
cout<<arr[0]<<" "<<arr[6]<<"\n";
}
# 陣列 array
陣列取值

# 陣列 array
陣列改值
#include<bits/stdc++.h>
using namespace std;
int main(){
int arr[]={1,5,8,3,4,5,7};
cout << arr[0] <<'\n';
arr[0] = 2;
cout << arr[0] <<'\n';
}
# 陣列 array
陣列改值

# 陣列 array
輸入
cin
- cin>>已經宣告的變數;
- 讀到空白 換行 代表結束
輸入
# 輸入 cin
- cin>>已經宣告的變數;
- 讀到空白 換行 代表結束
輸入
#include<bits/stdc++.h>
using namespace std;
int main(){
string a;
cin >> a;
cout << a;
}

# 輸入 cin
- 那如果我想讀整行怎麼辦
輸入
#include<bits/stdc++.h>
using namespace std;
int main(){
string a;
getline(cin,a);
cout << a;
}

getline(cin,變數)
# 輸入 cin
運算子
# = 賦值運算子
= 賦值運算子
- 和數學意義不同

所以a=3
代表把3存進 a 裡
也就是讓 a 變為3
不是把 3 變成 a
# + - * / % () 運算子
+ - * / % () 運算子
- 先乘除後加減
- % (mod) 算餘數 ex: 11%3=2
- 整數/整數 無條件捨去 ex: 11%3=3
- ()內最先算
# ++ -- 運算子
++ -- 運算子
- ++ 增加1
- -- 減少1
- ++a 先加
- a++ 後加
# += -= *= /= %= 運算子
+= -= *= /= %= 運算子
a += b;
a = a + b;
就是懶
# == != >= <= > < 關係運算子
== != >= <= > < 關係運算子
- != 是 ≠
- == 兩邊相同時 成立(true)
- 不同時 不成立(false)
# == != >= <= > < 關係運算子
&& || ! 邏輯運算子
- && 邏輯且
- || 邏輯或
- ! 反邏輯(加在左側)
條件
if - else 之類的東東
- 邏輯
- 很多邏輯
更多邏輯
條件
if 如果
if(條件){
執行的東西一; //條件成立(true)時執行
執行的東西二;
}
# if-else 用法
前面條件不成立(否則)
且
這個的條件成立
- 前面必須是 if 或 else if
else if 否則如果
# if-else 用法
else if
if(條件1){
執行的東西一;
}
else if(條件2){
執行的東西二;
}
# if-else 用法
更多else if
if(條件1){
執行的東西一;
}
else if(條件2){
執行的東西二;
}
else if(條件3){
執行的東西三;
}
.
.
.
# if-else 用法
- 前面條件不成立(否則)
- 前面必須是 if 或 else if
else 否則
# if-else 用法
# if-else 用法
else
if(條件1){
執行的東西一;
}
else if(條件2){
執行的東西二;
}
else if(條件3){
執行的東西三;
}
else{
執行的東西四; //不符合上述所有條件時執行
}
# if-else 用法
範例扣
#include<iostream>
using namespace std;
int main(){
int score;
cin >> score;
if(score >= 90){
cout << "get A\n";
}
else if(score >= 80){
cout << "get B\n";
}
else if(score >= 70){
cout << "get C\n";
}
else{
cout << "我懶得打那麼多了._.\n";
}
}
# if-else 用法
範例輸出

- 用來比較數值或字元
switch-case
# switch-case 用法
# switch-case 用法
switch-case
switch(變數名稱或運算式) {
case 符合數字或字元:
陳述句一;
break;
case 符合數字或字元:
陳述句二;
break;
default:
陳述三;
break;
}
範例扣
#include<iostream>
using namespace std;
int main(){
int score;
cin >> score;
switch(score/10) {
case 9:
cout << "get A\n";
break;
case 8:
cout << "get B\n";
break;
case 7:
cout << "get C\n";
break;
default:
cout << "我懶得打那麼多了._.\n";
break;
}
}
# switch-case 用法
範例輸出

# switch-case 用法
一個小問題
#include<iostream>
using namespace std;
int main(){
int a;
cin >> a;
switch(a) {
case 9:
a++;
case 10:
cout << "欸嘿\n";
break;
}
}
這段程式碼會輸出什麼?
# switch-case 用法
一個小答案

# switch-case 用法
迴圈
Loop
- 做事
- 重複的做事
- 保持在某種情況下重複做事
迴圈
# for 迴圈
for 迴圈
for(事前初始化;判斷條件;一次迴圈後結束執行){
執行的東東;
}
事前初始化 →
符合判斷條件 → 執行的東東 → 迴圈結束執行 →
符合判斷條件 → 執行的東東 → 迴圈結束執行 → ... → 不符合判斷條件 → 跳出迴圈
#include<iostream>
using namespace std;
int main(){
for(int s=0;s<5;s++){
cout<<s<<"\n";
}
}
範例扣
# for 迴圈
範例輸出

# for 迴圈
# while 用法
while 用法
while(每次做之前判斷){
要做的事;
}
當表示式為true,不斷重複執行
和if的差別
while 內會一直重複,if 只會執行一次
# while 用法
while 飯粒
#include <iostream>
using namespace std;
int main(){
int a = 1;
while (a < 6) {
cout << a << " ";
a++;
}
}

# while 用法
無窮迴圈!
while(true){
//do something
}
在這個情況下 程式永遠不會結束(?
最後會無限的執行直到程式崩潰
for(;;){
//do something
}
# while 用法
break;
while(true){
//do something
if(something){
break;
}
}
判到something為真時,
就會成功跳出迴圈la
# while 用法
continue;
while(true){
//do something 1
if(判斷式){
continue;
}
//do something 2
}
做完something 1之後
若判斷式為true,便會跳過something 2
直接進行下一次迴圈( for迴圈也能用喔 )
排版
Coding Style
- 增加程式可讀性
- 讓程式更好看
- 讓自己看得懂自己在寫什麼
避免被學長罵
排版
- 不毒瘤的縮排,通常 2 / 4 個空白
- 好的變數命名
- 有順序有意義的定義函式和變數
- 分段
- 適當的一些註解
- 大括號不換行
- 小括號和大括號中間空格
- 多層括號中間空格為佳
- 正常的表達方式
- 正常的思維方式
一份好的扣要有什麼
# 排版 coding style
題單
Problem list
iscoj
當然因為 iscoj 是我們的 oj
所以這上面的每一題都希望你們可以上去試試看
# 題單 Problem list
Tioj
# 題單 Problem list
zerojudge
# 題單 Problem list
感謝聆聽
下捷克在劍
欸不是這串真的是自動選字出來就長這神奇樣
小社課之四之演算法之零
By ganyumywife
小社課之四之演算法之零
- 460