# APCS

<!--  -->
:::info
[TOC]
:::
<br/>
## __簡介__
__Advanced Placement Computer Science__, ++大學程式先修檢測++是由台灣大學資訊工程系受教育部委託舉辦的測驗,目標是讓高中生具備基礎的程式設計能力,內容涵蓋 __資料結構、演算法、計算思維__,考制分為++觀念題++與++實作題++,分別評分級分 1~5 級。並且部分大學會將 APCS 成績納入招生評分或抵免學分使用。

<br/>
## __測驗內容__
- APCS 主要分為兩大部分:[作答系統說明](https://apcs.csie.ntnu.edu.tw/index.php/info/systemdescription/)
1.__觀念題__ ==(40 分鐘,共 25 題,每題 4 分)==
:::danger
++可以跳題,有必要時可以先跳複雜或需要大量計算 !++
:::
- 內容涵蓋:
a. 演算法與資料結構(排序、搜尋、堆疊、佇列、遞迴等)
b. 記憶體與變數範圍
c. 基礎計算與邏輯運算
d. 控制結構(迴圈、條件判斷)
e. 物件導向程式設計(Class、Method、繼承等)
f. 運算效率(時間與空間複雜度分析)
2. __實作題__ ==(150 分鐘,共 4 題,每題 100 分)==
:::success
++第一題永遠是最簡單的,這分數一定要拿 ~++
:::
- 內容涵蓋:
a. 讀取輸入、格式化輸出
b. 陣列、字串處理
c. 遞迴與分治法
d. 基礎圖論(BFS、DFS)
e. 動態規劃(DP)
f. 資料結構(Set、Map、Linked List)
g. 模擬(Simulation)
h. many others
<br/>
## __語言選擇__
不同程式語言有不同的特性,在 APCS 或競賽解題中,建議選擇適合自己的語言能幫助你更高效地解題。
-  **C++**
- 🔹 **優點**
- **執行速度快**:C++ 是編譯語言,效能最佳,適合大型數據運算。
- **STL(標準模板庫)強大**:內建 `vector`, `set`, `map`, `priority_queue` 等資料結構,讓解題更方便。
- **手動記憶體管理**:靈活運用 `new`、`delete`,但需注意記憶體洩漏問題。
- 🔻 **缺點**
- **語法較複雜**,學習門檻較高。
- **指標(pointers)概念較難掌握**,需額外花時間學習。
- 需手動管理記憶體,可能會導致 **記憶體洩漏**(不影響競程但需留意)。
- **用途**
1. **APCS 解題**
2. **競程比賽(IOI, LeetCode Contest)**
3. **高效能系統、嵌入式系統**
4. **Unreal Engine**
5. **各種軟體開發**
:::spoiler **C++ Resource**
- **[C++ Online Compiler](https://onecompiler.com/cpp)**
- **[Dev C++ 官網](https://www.bloodshed.net/)**
- **[MinGW64+vscode 安裝教學](https://www.youtube.com/watch?v=8QdDlNOMCgA)**
:::
---
-  **Python (v2/v3)**
- 🔹 **優點**
- **語法簡單直覺**,適合初學者。
- **強大內建函式庫**,可快速處理數據(`sum(list)`, `sorted(list)`)。
- **適合數據分析與 AI/機器學習**,如 NumPy, Pandas, TensorFlow。
- 🔻 **缺點**
- **執行速度慢**:Python 是 **直譯語言**,相較 C++ **慢 10~100 倍**。
- **變數型別是動態類型(dynamic typing)**,容易出錯(如 `list` vs `tuple`)。
- **記憶體管理較自動化,但難以最佳化**,影響大數據運算的效能。
- **用途**
1. **不建議用於 APCS 解題**
2. **AI / 機器學習(ML)**
3. **數據分析、腳本開發**
4. **高階軟體開發**
:::spoiler **Python Resource**
- **[Python Online Compiler](https://www.onlinegdb.com/online_python_compiler)**
- **[Google Colab 官網](https://colab.google/)**
- **[Python 官網](https://www.python.org/)**
- **[Jupyter Notebool](https://jupyter.org/install)**
:::
---
-  **Java** (較不建議)
- 🔹 **優點**
- **語法中等**:比 C++ 友善,不需手動管理記憶體(**自動垃圾回收 GC**)。
- **物件導向(OOP)強大**,適合大型專案開發。
- **內建類別豐富**:如 `ArrayList`, `HashMap`, `TreeSet`,處理資料較方便。
- 🔻 **缺點**
- **執行速度較慢**:Java 透過 **JVM** 執行,速度比 C++ 慢 2~5 倍。
- **程式碼較冗長**,有較多樣板程式(boilerplate code)。
- **IO(輸入輸出)較慢**,可能需使用 `BufferedReader` 最佳化。
- **用途**
1. **APCS 官方推薦語言**
2. **物件導向開發**
3. **企業級應用(Spring, Android 開發)**
4. **各式軟體開發 (Mobile 為主)**
:::spoiler **Java Resource**
- **[Java Online Compiler](https://onecompiler.com/java)**
- **[Java 官網](https://www.java.com/zh-TW/)**
:::
<br/>
### _++簡易示範題目++_
<< [ZeroJudge - a002. 簡易加法](https://zerojudge.tw/ShowProblem?problemid=a002) >>
- 題目:
- 敘述: 請寫一個程式,讀入兩個數字 a, b,並求出它們的和。
- 輸入格式:
- 每組輸入共一行,內含 兩個整數 `a` 和 `b`,以空白隔開。
- 整數 `a`, `b` 的絕對值皆小於 $10^9$。
- 輸入格式: 對於每組輸入,輸出該 兩整數的和。
---
1. C++ 解法:
```CPP[]
#include <iostream> // 引入標準輸入輸出函式庫
using namespace std;
int main() {
int a, b; // 宣告兩個整數變數
cin >> a >> b; // 從標準輸入讀取 a 和 b
cout << a + b << endl; // 輸出 a + b 的結果
return 0;
}
```
---
2. Python 解法:
```Python[]
# 讀取輸入,並以空白分割成兩個數字
a, b = map(int, input().split())
print(a + b) # 計算並輸出結果
```
---
3. Java 寫法:
```Java[]
import java.util.Scanner; // 引入 Scanner 類別
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); // 建立 Scanner 物件
int a = sc.nextInt(); // 讀取第一個整數
int b = sc.nextInt(); // 讀取第二個整數
System.out.println(a + b); // 輸出兩數之和
sc.close(); // 關閉 Scanner
}
}
```
<br/>
## 評分方式
* 

<br/>
## Q&A
- ++(Q1) **APCS 考試的難度如何?**++
APCS 難度依題目而異,一般來說:
1. 觀念題範圍廣,但大多屬於基本概念與推理題。
2. 實作題有**遞迴、排序、動態規劃、圖論**等經典演算法,難度大概跟 **LeetCode** 平台上 Easy 題還有 Medium 題的程度。
- ++(Q2) **如何準備 APCS?**++
**程式觀念題準備:**
- 熟悉 **演算法概念(排序、搜尋、遞迴)**
- 了解 **時間複雜度分析(Big-O 記號)**
- 練習程式碼 **輸出推理題**(Python、Java、C++)
**實作題準備:**
- **刷題**:練習 __ZeroJudge__、__LeetCode (Easy/Medium)__ 題目
- **熟悉測資測試方式**,學會 Debug 與優化程式碼
<br/>
:::spoiler Relevant
- [大學程式先修檢測](https://apcs.csie.ntnu.edu.tw/)
- [ZeroJudge 平台](https://zerojudge.tw/)
- [LeetCOde 平台](https://leetcode.com/)
:::