SCIST S5
演算法培訓課程

2024/10/27

南臺灣學生資訊社群

Students' Community of Information in Southern Taiwan

嘉義、台南、高雄、屏東等四地高中生組成的學生自治資訊教育社群。
長期透過舉辦課程與活動推廣資訊領域,減少南北資訊領域的資源落差。
爲南部提供一個良好的學習環境,提升南部學生整體的資訊能力。

SCIST 總覽

行政招募

 7 月

推廣課程

 9 月

培訓課程

每年 10 月 ~ 隔年 6 月

多元主題工作坊(暫)

暑假

聯合營隊

 寒假

資訊社團合作、社課支援

長期

行政招募

  • 公關

  • 文書

  • 美宣

  • 剪輯

  • 助教

推廣課程

  • 各地舉辦為期一天的體驗課程

南部多校聯合寒訓

  • 課程

    • 演算法

    • 資訊安全

  • 闖關活動

  • 晚會表演

  • 科技公司講座

  • 經驗分享講座

副召籌辦心得文
(我拖到現在還沒寫完
但有一堆照片可以看)

合作社團

  • 互相宣傳

  • 有保證錄取名額

培訓課程

  • 免費且為期一年的課程

    • 演算法

    • 資訊安全

培訓課程招生相關資料

培訓課程詳細介紹

培訓目標

  • 初階班:零程式基礎 →
    能熟練運用 C++ 語法,瞭解基礎資料結構與演算法,且能在 APCS 中獲得觀念題 3 級分 + 實作題 3 級分的成績,並積極參與各大程式競賽累積經驗。

 

  • 進階班:具備 C++ 語法能力 →
    瞭解進階資料結構與演算法,能在 APCS 中獲得觀念題 4 級分 + 實作題 4 級分,甚至滿級分的成績,並希望能在 YTP 少年圖靈計畫初賽中晉級程式挑戰營、國立成功大學暑期高中生程式設計邀請賽中晉級決賽、NPSC、ISSC、CodeWars…等各大程式競賽中獲獎。

講師:吳彥德(SA)

  • 2006 臺南區資訊學科能力競賽第一名
  • 2007 全國資訊學科能力競賽一等獎
  • 2008 亞太資訊奧林匹亞金牌
  • ACM ICPC 雅加達賽區第 5 名
  • 曾任臺灣 Google 軟體工程師

SA 流 C++ 競程修練心法 講義作者

演算法培訓課表

結訓評分標準

請假規則

  • 如需請假,請至少在 課程前一天 23:59 前填寫 請假表單
  • 若當天需臨時請假請使用 SCIST Discord Ticket 功能 直接請假並說明原因
  • 請假者請自行至 SCIST YouTube 觀看課程直播錄影檔補課(當週課程結束後約兩週左右將會釋出經過剪輯的精華版影片)
  • 如有特殊狀況或不可抗力因素填寫完表單後可另開 Ticket 說明,若審核無誤將不計入出席率
  • 若沒有請假卻無故缺席將直接取消實體學員資格
  • 請假前務必先評估自身出席狀況避免無法結訓

其他注意事項

  • 午餐需自理,時長為 1.5 小時。若無頭緒可參考 SCIST 美食地圖,學員若有推薦的也可在文件中自行新增內容。
  • 可以自備筆電,但若無筆電,教室仍有電腦可以使用
  • 任何課程相關的更動我們將透過 Discord 公告頻道、Facebook/Instagram 粉絲專頁及寄送 Email 的方式公告,請特別留意是否有時間或場地更動
  • 電腦教室內嚴禁飲食,有攜帶飲料或外食請放在教室外的桌子上。教室內可以喝水但請避免灑出來,若引起任何設備損壞需自負賠償責任。
  • 課堂練習時歡迎踴躍討論,但請控制音量避免影響他人。
  • 課堂中如有疑問歡迎在 Discord 踴躍討論,或是向助教提問。
  • 講師教課時建議先認真聽講,練習時間再用電腦實作

相關連結

還記得進階班報名時寫的小測驗嗎?

先來看看大家的解法

1. 排序後取頭尾

#include <bits/stdc++.h>
using namespace std;

const int N = 1e5+5;
int a[N];

int main()
{
    int n; cin >> n;
    for(int i=0; i<n; i++) cin >> a[i];
    sort(a, a+n);
    cout << a[0] << ' ' << a[n-1] << ' ' << a[0] * a[n-1] << '\n';
    return 0;
}

2. 用 STL 的 algorithm:min_element/max_element

#include <bits/stdc++.h>
using namespace std;

int main() {   
    int n, num;
    vector<int> v;
    cin >> n;
    for(int i=0; i<n; i++){
        cin >> num;
        v.push_back(num);
    }
    int mi = *min_element(v.begin(), v.end());
    int mx = *max_element(v.begin(), v.end());
    cout << mi << ' ' << mx << ' ' << mi * mx << '\n';
    return 0;
}

一半的人沒注意到的地方

Overflow 溢位

我的解法,不用 sort 或 max_element( ):

#include <bits/stdc++.h>
using namespace std;

int main()
{
	int n, t, mi = 1e9, mx = -1e9; cin >> n;
	while(n--)
	{
		cin >> t;
		mx = max(mx, t);
		mi = min(mi, t);
	}
	cout << mi << ' ' << mx << ' ' << (long long)mi * mx << '\n';
}

極值設範圍、不開陣列、每讀一個直接更新不用寫 if、不開第三個變數而是直接強制轉型成 long long 後再相乘

我們來比較一下不同做法的時間複雜度

(下午的課會詳細的教到)

1. sort 後取頭尾

2. max_element( )

3. 讀入時用變數維護極值

O(n log n)

O(n)

O(n)

提問時間

歡迎大家直接舉手提問或使用線上匿名提問平台

自由時間

  • 認識身邊的學員、交流討論

  • 看看講義、資源彙整、剛剛介紹的內容

  • 練習題單 直接開卷

  • 確認自己有沒有收到 SCIST Courses 寄的信件

  • 確認自己有沒有 SCIST Discord 身份組

SCIST_1027

By 4yü

SCIST_1027

  • 339