演算法與解題技巧

 

by 建國中學 張均豪 賴昭勳

解題基本介紹

演算法是什麼?

解決一種問題的方法

基本實作例題

輸入兩個點,輸出他們的距離

數學公式代下去

找到一個陣列的最大值

3n + 1 問題

給一個整數\(n\)

如果是偶數的話就除2

如果是奇數的話就乘以3然後加1

輸出總共幾次之後那個數字會變成 1

輸出 1~n 的所有質數

用迴圈+條件判斷

int n;
cin >> n;
for (int i = 2;i <= n;i++) {
	bool isprime = true;
	for (int j = 2;j < n;j++) {
    	if (n % j == 0) {
        	isprime = false;
        	break;
        }
    }
    if (isprime) {
    	cout << i << endl;
    }
}

執行效率?

電腦也沒有你想像的那麼快

\(3 * 10^8\) 次操作 / 秒還不夠用?

時間複雜度?

運算次數和問題大小的關係

想法題目例題

Google Codejam 2020 Qualification Round - Nesting Depth

CF 1389 A

LCM Problem

CF 1392 A

Omkar and Password

欣賞難題囉

TIOJ 1777

AtCoder Beginner Contest 174-D

Alter Altar

#include <iostream>
using namespace std;
int main () {
	int n;
	cin >> n;
	int a[n];
	int zeronum = 0;
	for (int i = 0;i < n;i++) {
		char c;
		cin >> c;
		if (c == 'R') {
			a[i] = 0;
			zeronum += 1;
		} else {
			a[i] = 1;
		}
	}
	int zeros = 0, ones = 0;
	int ans = 10000000;
	for (int i = 0;i <= n;i++) {
		int m = 0;
		if (zeronum - zeros > ones) {
			m = zeronum - zeros;
		} else {
			m = ones;
		}
		if (m < ans) {
			ans = m;
		}
		if (i < n) {
			if (a[i] == 0) {
				zeros += 1;
			} else {
				ones += 1;
			}
		}
	}
	cout << ans << endl;
}

謝謝大家的聆聽

Made with Slides.com