---
# System prepended metadata

title: S3 演算法 week 2
tags: [S3 公開資源]

---

# S3 演算法 week 2
###### tags: `S3 公開資源`

:::info
時間：10/16 9:00 ~ 17:00
地點：成大資工系新館 **65304** 教室
主題：C++ 基礎語法（下）
直播連結：https://youtu.be/s3kvJUNUvVk
:::

## 課程內容
- 課程規則介紹
- C++ 語法基礎
    - 迴圈
    - 陣列
    - 函式
- 講義連結：https://hackmd.io/@sa072686/cp/%2F%40sa072686%2FrJpY0i7PS


## 注意事項
1. 請先預習講義序章及初章前半第四章之後（含第四張）的內容，並且完成第一次上課的必做題
2. 第一堂課的必做題題解放在第一堂課的指引：https://hackmd.io/@SCIST/S1bifz-zo
3. 第一堂課請假或是未繳交同意書的實體學員，請務必繳回課前通知信所附的家長同意書
4. 上課期間請全程配戴口罩
5. 建議學員可以帶自己的筆電，以減少重新設定的時間成本
6. 請假表單：https://forms.gle/2ESVuTezcHCK959H6

# 必做題題解

[TOC]

## 初章 - 第四節

### [TOJ 578](https://toj.tfcis.org/oj/pro/578/)

撰寫者：Jun-an

從 0 開始跳 n 個格子，
但是只輸出奇數。

:::spoiler 參考程式碼 (while 迴圈版本)
```cpp=
#include <iostream>

using namespace std;

int main(){

    int n, i;
    cin >> n;
    
    i = 0;
    while(i < n){
        if(i % 2 == 1){
            cout << i << '\n';
        }
        
        i++;
    }

    return 0;
}
```
:::
:::spoiler 參考程式碼 (for迴圈版本)
```cpp=
#include <iostream>

using namespace std;

int main(){

    int n;
    cin >> n;

    for(int i = 1; i < n; i += 2){
        cout << i << '\n';
    }
    
    return 0;
}
```
:::
---

### [TOJ 576](https://toj.tfcis.org/oj/pro/576/)

撰寫者：Eason

把數字一直除以10，直到他被除到0
然後用一個變數紀錄你總共除了幾次

:::spoiler 參考程式碼
```cpp=
#include<iostream>
using namespace std;

int main(){
    int n;
    cin >> n;
    int counter = 0;//用這個變數紀錄總共除了幾次
    while(n != 0){
        counter++;
        n /= 10;
    }
    cout << counter << '\n';
    return 0;
}
```
:::

---
### [TOJ 577](https://toj.tfcis.org/oj/pro/577/)

撰寫者：Jun-an

本題須注意測資範圍！！！

有 $n$ 筆輸入，每筆皆要計算 $a ^ b$，
以 $2 ^ 3$ 為例，$2 ^ 3$ = $2$ * $2$ * $2$，
但其實可以改成 $2 ^ 3$ = $1$ * $2$ * $2$ * $2$，
因為 $a ^ 0$ = $1$，所以將答案預設為 $1$ 正好可以應對。

另外補充：
$pow(a, b)$ 雖然可以計算 $a ^ b$，但是回傳值是浮點數型別，
如果你要計算的 $a ^ b$ 是 $int$ 型別，很可能會出現誤差，
所以這裡不建議使用，請使用本堂課教的 $for / while$ 迴圈實作。

:::spoiler 參考程式碼
```cpp=
#include <iostream>

using namespace std;

int main(){
    int n;
    cin >> n;
    
    while(n--){
        long long a, b, ans = 1;
        cin >> a >> b;
        
        for(int i = 0; i < b; ++i){
            ans *= a;
        }
        
        cout << ans << '\n';
    }
    
    return 0;
}
```
:::

---
### [kattis FizzBuzz](https://open.kattis.com/problems/fizzbuzz)

撰寫者：Eason

給你三個數字X 、Y 還有N
要你輸出1 到N 中
可以被X 整除就輸出Fizz
可以被Y 整除就輸出Buzz
同時可以被X 跟Y 整除就輸出FizzBuzz
都不能被兩者整除就輸出當前數字

:::spoiler 參考程式碼
```cpp=
#include<iostream>
using namespace std;

int main(){
	int x, y, n;
	cin >> x >> y >> n;
	for(int i=1; i<=n; i++){
        if(i%x == 0 && i%y == 0){
            cout << "FizzBuzz\n";
        }
        else if(i%x == 0){
            cout << "Fizz\n";
        }
        else if(i%y == 0){
            cout << "Buzz\n";
        }
        else{
            cout << i << '\n';
        }
	}
	return 0;
}

```
:::

---
### [kattis Job Expenses](https://open.kattis.com/problems/jobexpenses)

撰寫者：fishhh

給你一堆數字，把所有小於0的數加起來，就是答案ㄌ

:::spoiler 參考程式碼
```cpp
#include "iostream"
using namespace std;
int main(){
	int n,k,ans=0; // 記得初始化
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>k;
		if(k<0){
			ans+=(k*-1);
		}
	}
	cout<<ans;
}
```
:::

---

### [Atcoder abc204_b](https://atcoder.jp/contests/abc204/tasks/abc204_b)

撰寫者：Eason

把大於等於10 的數字減掉10 之後
全部加起來

:::spoiler 參考程式碼
```cpp=
#include<iostream>
using namespace std;

int main(){
    int n;
    cin >> n;
    int temp, sum = 0;//記得要把sum 初始化為0
    for(int i=0; i<n; i++){
        cin >> temp;
        if(temp >= 10){
            sum += temp - 10;
        }
    }
    cout << sum << '\n';
    return 0;
}

```
:::

---

### [kattis Last Factorial Digit](https://open.kattis.com/problems/lastfactorialdigit)

撰寫者：fishhh

用迴圈將n!算出來，再取(n! % 10) 就可以知道n!的個位數是多少了

:::spoiler

```cpp=
#include "iostream"
using namespace std;
int main(){
	int t,n;
	cin>>t;
	for(int i=0;i<t;i++){
		cin>>n;
		int tot=1;
		for(int x=1;x<=n;x++){ // 算出n!
			tot*=x;
		}
		cout<<tot%10<<"\n";
	}
}
```
:::

---

### [kattis hailstone](https://open.kattis.com/problems/hailstone)

撰寫者：Eason

其實題目講的很明白了
你現在有個數字n
- 如果n 是1 就不進行操作
- 如果n 是奇數 就讓n 變成 3n + 1
- 如果n 是偶數 就讓n 變成 n / 2

不過題目有特別要求要把過程的n 全部加起來
所以要開一個變數儲存加總

:warning: 雖然題目給的數字範圍不會超過 int
但如果給一個足夠大的奇數 例如 $2^{31}-1$ 之類的
只要乘以3 就會馬上溢位

所以 即使題目給的數字在 int 以內 還是要小心!!

:::spoiler 參考程式碼
```cpp=
#include<iostream>
using namespace std;

int main(){
    long long n, sum = 0;
    cin >> n;
    while(n!=1){
        sum += n;
        if(n % 2 == 0){
            n = n / 2;
        }
        else{
            n = 3 * n + 1;    
        }
    }
    sum += 1;
    cout << sum << '\n';
    return 0;
}
```
這個迴圈看到1 就會跳出
導致sum 在迴圈裡面是算不到1 的
所以第16行的用意就是補上沒加到的那個1
:::

---

### [Kattis climbingworm](https://open.kattis.com/problems/climbingworm)

撰寫者：Jun-an

一條蟲要從 0 爬到 h，
但是每往上爬 a 就會 下滑 b，
不過如果往上爬 a 的時候到達 h 就要結束。

:::spoiler 補充觀念
這裡提供其他作法，還是請使用本堂課所教觀念去做~

可以知道 爬到終點前所做的最後一個動作一定是向上爬 a
那麼 剩下的每次爬行都會上升 $(a-b)$ 的高度
所以 我們用除法即可算出要爬幾天

但這個做法要注意的是減掉 a 後變成負數的情形
:::

:::spoiler 參考程式碼
```cpp=
#include <iostream>

using namespace std;

int main(){
    int a, b, h;
    cin >> a >> b >> h;
    
    int now = 0, i = 0;
    while(true){
        now += a;
        i++;
        
        if(now >= h){
            break;
        }
        
        now -= b;
    }
    
    cout << i << '\n';
    
    return 0;
}
```
:::

---

### [kattis Stopwatch](https://open.kattis.com/problems/stopwatch)

撰寫者：fishhh

可以先去想 什麼情況會出現「still running 」
||當n是奇數的時候||
這時候，我們就可以直接輸出 「still running 」 然後return 0

再來可以知道，按第一下後，計時器就會開始
第二下時 計時器就會停止
所以可以推得 兩個兩個一組 之間的時間就是計時器有在計時的時間
:::spoiler
```cpp 參考程式碼
#include "iostream"
using namespace std;
int main(){
	int n;
	cin>>n;
	if(n%2==1){
		cout<<"still running\n";
		return 0;
        //這裡寫的是比較簡單的寫法 因為只有一筆測資
        //如果是多重輸入的話 還是要將測資讀完喔~
        
	}
	int ans=0,a,b;
	for(int i=0;i<(n/2);i++){ //這邊的n必定是偶數 所以不會有被捨去的狀況
		cin>>a>>b;
		ans+=b-a;
	}	
	cout<<ans<<"\n";
}
```
:::

---

### [kattis Soda Slurper](https://open.kattis.com/problems/sodaslurper)

撰寫者：fishhh

這題有迴圈解以及數學解 
迴圈當然就是一次一次換 換到不能再換就可以把迴圈停掉了~

:::spoiler 參考程式
```cpp
#include<iostream>

using namespace std;

int main(){
    int a,b,c,h,tot=0,tmp;
    cin>>a>>b>>c;
    h=a+b;
    while(h>=c){
        tot+=h/c;
        tmp=h/c;
        h%=c;
        h+=tmp;
    }
    cout<<tot<<"\n";
    return 0;
}
```
:::

:::spoiler 數學解
在這裡 這種題目會有兩種狀況
先假設每換一次需要$a$個空瓶，可以換得$b$瓶飲料(本題 $b=1$ )
1. 允許借空瓶 (這題不行
兌換一次實際會減少$(a-b)$個瓶子
於是每$n$個空瓶可以兌換到 $\lfloor \frac{n}{a-b} \rfloor * b$
2. 不允許借空瓶
可以先發現一件事 
$if(n<a)$ 那麼一次都沒辦法兌換 qwq
$if(n>=a)$ 那麼就一直換 直到剩餘的空瓶數小於$a$就要暫停
那 我們會先留$a$個空瓶 做為未來可以借來用
> 至於為什麼是$a$個 可以這樣想 如果我們需要借大於等於$a$個
> 那我們必定無法把它還完 畢竟一次只會換到$b$個 且$b$一定小於$a$
> 那不是就永遠沒辦法還了?

再來我們就可以根據允許借空瓶的公式帶入
$n-a$個空瓶總共可以兌換 $\lfloor \frac{(n-a)}{(a-b)} \rfloor$ 次
然後如果要借 就一定會還完 所以我們剩下的$a$瓶 可以再換一次
(剩下的那$a$個換來的$b$瓶必定不能在換一次owo)

所以兌換總次數為：
$\lfloor \frac{(n-a)}{(a-b)} \rfloor + 1$ 次
化簡一下 就會變成
$\lfloor \frac{(n-b)}{(a-b)} \rfloor$ 次
最後 把次數乘上$b$就知道可以換到幾瓶惹~
$\lfloor \frac{(n-b)}{(a-b)} \rfloor *b$瓶
上式也就是這題的解
:::


## 間章

### [UVa 10963](http://domen111.github.io/UVa-Easy-Viewer/?10963)

簡單來說 就是判斷每一格的高度差是否相同即可~
(但題目好像有點難以理解?XD

:::spoiler
```cpp=
#include<iostream>
using namespace std;
int main(){
  int n, W;
  int y1, y2, dis;
  bool ok;
  while(cin>>n){
    for( int i = 0 ; i < n ; i++ ){
      if( i != 0)cout<<"\n";
      cin>>W;
      ok = true;
      if( W != 0 ){
        cin>>y1>>y2;
        dis = y1-y2;
        for( int j = 1 ; j < W ; j++ ){
          cin>>y1>>y2;
          if( y1-y2 != dis ) ok = false;
        }
      }
      if( ok ) cout<<"yes\n";
      else cout<<"no\n";
    }
  }
  return 0;
}
```
:::




## 初章 - 第四節半

### [TOJ 104](https://toj.tfcis.org/oj/pro/104/)

撰寫者：Eason

這題找到規律 就很簡單了
當你在第i 層
那麼你的星星數量就是||2i - 1||
印出來會長這樣
> \*
> \***
> \*****
> \*******

所以只有找到這個規律是不夠的
我們還需要知道星星的前面有幾個空格
不難發現 就是||n - i||

:::spoiler 參考程式碼
```cpp=
#include<iostream>
using namespace std;

int main(){
    int n;
    cin >> n;
    for (space=n-1, star=1; space>=0; space--, star+=2) //建議將參數都寫在一起 迴圈內才不會很亂~
        //也比較不需要去思考參數間的關係
    {
        for (i=0; i<space; i++)
        {
            cout << " ";
        }
        for (i=0; i<star; i++)
        {
            cout << "*";
        }
        cout << "\n";
    }
    return 0;
}
```
:::

---

### [Kattis sifferprodukt](https://open.kattis.com/problems/sifferprodukt)

撰寫者：fishhh

題意：
把一個數字 $x$ 每一位非零的數相乘，直到 $x$ 小於10(不能再繼續操作)

解法：
用while迴圈重複進行操作 直到 $x<10$
再用一個while迴圈取出 $x$ 的每個位數並相乘
:::spoiler 參考程式碼
```cpp=
#include "iostream"
using namespace std;
int main()
{
	int x;
	cin>>x;
	while(x>=10){
		int new_x=1;
		while(x!=0){
			int now=x%10;
			if(now!=0){
				new_x*=now;
			}
			x/=10;
		}
		x=new_x;
	} 
	cout<<x<<"\n";
}
```
:::

---

### [Uva 488](http://domen111.github.io/UVa-Easy-Viewer/?488)

撰寫者：fishhh

實作題，用for迴圈會比較好完成
需要稍微注意一下換行符號的輸出~

:::warning
注意換行的問題 否則會拿到 PE
:::
:::spoiler 參考程式碼
```cpp=
#include "iostream"
using namespace std;
int main()
{
	int n;
	cin>>n;
	int a,f;
	for(int i=0;i<n;i++)
	{
        if(i!=0){
            cout<<"\n";
        }
		cin>>a>>f;
		for(int j=0;j<f;j++){
            if(j!=0){
                cout<<"\n";
            }
			for(int k=1;k<=a;k++){
				for(int l=0;l<k;l++){
					cout<<k;
				}
				cout<<'\n';
			}
			for(int k=a-1;k>=1;k--){
				for(int l=0;l<k;l++){
					cout<<k;
				}
				cout<<'\n';
			}
		}
	}
}
```
:::

---

### [Math Homework](https://open.kattis.com/problems/mathhomework)

撰寫者：小麥

用for裡面在包for，要包三層，有一點要注意的是，每一層都要判斷計算是否已超過，如果有一組都沒有輸出的話則要輸出impossible

:::info
值得注意的是 再最後一圈 k 的時候 可以判斷 (n-i-j)%k==0 就好
也就是判斷 剩餘的腳數是否可以被k整除
可以省掉一些時間~
:::

:::spoiler 參考程式碼
```cpp
#include <iostream>
using namespace std;

int main() {

    int a, b, c, n;

    cin >> a >> b >> c >> n;

    bool flag = true;

    for (i=0; i<=n; i+=a)
    {
        for (j=0; i+j<=n; j+=b)
        {
            for (k=0; i+j+k<=n; k+=c)
            {
                if(i+j+k==n){
                    flag = false;
                    cout<<i<<" "<<j<<" "<<k<<"\n";
                }
            }
        }
    }

    if (flag) {
        cout << "impossible" << "\n";
    }

    return 0;
}
```
:::


---

### [TOJ 494](https://toj.tfcis.org/oj/pro/494/)

撰寫者：fishhh

用多層迴圈來完成這題(:warning:請自己練習:warning:)

:::spoiler 補充作法 by 小白
```cpp=
#include<iostream>
using namespace std;
 
int main(){
    int n, k;
    cin >> n >> k;
    for(int i = 1; i <= n; i++){  // 需要輸出的地板塊行數
        for(int q = 1; q <= k; q++){ // 每個地板塊的高度(行數)
            for(int j = 1; j <= n; j++){ // 每行有幾個地板塊
                for(int p = 1; p <= k; p++){ // 每個地板塊的寬度
                    // if((i + j) % 2 == 0)
                    //     cout << "*";
                    // else 
                    //     cout << ' ';
                    if(i%2 == 1){ // 奇數行
                        if(j%2 == 1){ // 奇數行的奇數塊先輸出星號，後輸出空白
                          cout << "*";
                        }
                        else{
                          cout << " ";
                        }
                    }
                    else if(i%2 == 0){ // 偶數行
                        if(j%2 == 1){ // 偶數行的偶數塊先輸出空白，後輸出星號
                            cout << " ";
                        }
                        else{
                            cout << "*";
                        }
                    }
                }
            }
            cout << endl;
        }
    }
    return 0; 
}
```
:::

:::spoiler 作法 1(講師補充 非常簡潔 但需要一些觀察)
考慮同一橫排位置每+1輸出會變，所以看位置奇偶交替
考慮同一直排位置每+1輸出會變，所以同一直排上，看橫排位置奇偶交替
可得結論：直排橫排相加後的奇偶可決定要輸出的文字

(截自學員的code)
![](https://hackmd.io/_uploads/B1Ultu-Ni.png)

:::


:::spoiler 作法 2(比較好想? 但需要寫很多程式以及判斷)
```cpp=
#include "iostream"
using namespace std;
int main(){
	int n,k;
	cin>>n>>k;
	for(int i=0;i<n;i++){ //每行
		for(int j=0;j<k;j++){
			if(i%2==0){//奇數行
				for(int l=0;l<n;l++){ //這裡 n 要減 1 
					if(l%2==0){
						for(int g=0;g<k;g++){
							cout<<"*";
						}
					}
					else{
						for(int g=0;g<k;g++){
							cout<<" ";
						}
					}
				}
			}
			else{
				for(int l=0;l<n;l++){
					if(l%2==0){
						for(int g=0;g<k;g++){
							cout<<" ";
						}
					}
					else{
						for(int g=0;g<k;g++){
							cout<<"*";
						}
					}
				}
			}
			cout<<"\n";
		}
	}
}
```
:::


---

## 初章 - 第五節

### [No Judge 儲存複數資料](https://hackmd.io/YTiYMA8zT9uCObxzri_11Q#%E5%84%B2%E5%AD%98%E8%A4%87%E6%95%B8%E8%B3%87%E6%96%99)

撰寫者：fishhh

用for迴圈加上陣列來完成

:::spoiler 參考程式碼
```cpp=
#include "iostream"
using namespace std;
int main(){
	int n,a[10];
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	for(int i=0;i<n;i++){
		cout<<"a["<<i<<"] = "<<a[i]<<"\n";
	}
}
```
:::

---

### [Reverse](https://open.kattis.com/problems/ofugsnuid)

撰寫者：小麥

先把資料存到陣列在倒放，記得陣列是從0開始數。

:::spoiler 參考程式碼
```cpp=
#include <iostream>

using namespace std;

int main() {

    int n;
    cin >> n;

    int arr[100010];
    for (int i = 0; i < n; i++) {
        cin >> arr[i];
    }

    for (int i = n - 1; i >= 0; i--) {
        cout << arr[i] << "\n";
    }

    return 0;

}
```
:::

---

### [License to Launch](https://open.kattis.com/problems/licensetolaunch)

撰寫者：小麥

找第一個最小值，並用一個變數存起來，為了方便可以將初使比較值設為一個大數。

:::spoiler 參考程式碼
```cpp=
#include <iostream>

using namespace std;

int main() {

    int n;
    cin >> n;

    int arr[100010];

    for (int i = 0; i < n; i++) {
        cin >> arr[i];
    }

    int mini = 99999999;
    int ans;

    for (int i = 0; i < n; i++) {
        if (mini > arr[i]) {
            ans = i;
            mini = arr[i];
        }
    }

    cout << ans << "\n";

    return 0;

}
```
:::

---

### [Jumbo Javelin](https://open.kattis.com/problems/jumbojavelin)

撰寫者：小麥

請以練習陣列為主!

:::spoiler 作法1 (陣列解)
```cpp=
#include "iostream"
using namespace std;
int main(){
    int n,ary[120]={};
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>ary[i];
    }
    int tot=0;
    for(int i=0;i<n;i++){
        tot+=ary[i];
    }
    cout<<tot<<"\n";
}
```
:::

:::spoiler 作法2 (no 陣列)
```cpp=
#include <iostream>

using namespace std;

int main() {

    int n;
    cin >> n;

    int sum = 0;
    for (int i = 0; i < n; i++) {
        int in;
        cin >> in;

        sum += in;
    }

    cout << (sum - (n - 1)) << "\n";

    return 0;

}
```
:::

---

### [No Judge 月份天數](https://hackmd.io/3bswkP4FRa-kE2S2ua7fcA#%E6%9C%88%E4%BB%BD%E5%A4%A9%E6%95%B8)

撰寫者：fishhh

:::spoiler
```cpp=
#include "iostream"
using namespace std;
int main(){
	int day[]={31,28,31,30,31,30,31,31,30,31,30,31};
	int n;
	cin>>n;
	cout<<day[n+1]<<"\n";
}
```
:::

---

### [No Judge 查詢出現次數](https://hackmd.io/p9Y-PTzWRZyqknDq3oPeGQ#%E6%9F%A5%E8%A9%A2%E5%87%BA%E7%8F%BE%E6%AC%A1%E6%95%B8)

撰寫者：小麥

先用陣列先把所有的值存起來，在去計算出現的次數。(再!!!)

---

### [最大出現次數 I](https://hackmd.io/p9Y-PTzWRZyqknDq3oPeGQ#%E6%9C%80%E5%A4%A7%E5%87%BA%E7%8F%BE%E6%AC%A1%E6%95%B8)

撰寫者：小麥


先用陣列先把所有的值存起來，在去看最大值。


---

### [最大出現次數 II](https://hackmd.io/p9Y-PTzWRZyqknDq3oPeGQ#%E6%9C%80%E5%A4%A7%E5%87%BA%E7%8F%BE%E6%AC%A1%E6%95%B81)

撰寫者：fishhh

用一個陣列來記錄每個數字的出現次數
以陣列的index值代表數字 而陣列的值即為其出現次數

:::spoiler 參考程式碼
```cpp=
#include "iostream"
using namespace std;
int main(){
	int time[1200]={};//記得初始化
	int n,k;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>k;
		time[k]++;
	}
	int max_time=0;
	for(int i=1;i<=1000;i++){
		if(time[i]>max_time){
			max_time=time[i];
		}
	}

	bool sec=0;
	cout<<"ans: [";
	for(int i=1;i<=1000;i++){
		if(time[i]==max_time){
			if(sec==1){
				cout<<", ";
			}
			cout<<i;
			sec=1;
		}
	}
	cout<<"]\n";
	
}
```
:::

---

### [四天王](https://hackmd.io/p9Y-PTzWRZyqknDq3oPeGQ#%E5%9B%9B%E5%A4%A9%E7%8E%8B)

撰寫者：小麥

先用陣列先把所有的值存起來，在去計數。

---

### [kattis reducedidnumbers](https://open.kattis.com/problems/reducedidnumbers)

撰寫者：Eason

找到一個整數m
使得所有的SIN 除以m 的餘數都不同
如果有很多整數都符合m
那就輸出最小的那個

可以直接窮舉m

:::spoiler 參考程式碼
```cpp=
#include<iostream>
using namespace std;

int main(){
    int n;
    cin >> n;
    int sin[n];
    for (int i = 0; i < n; i++){
        cin >> sin[i];
    }
    bool is_diff; //紀錄除以m的餘數是否相同，若true則全部不同，若false全部相同
    int m = 1;
    while (true){
        is_diff = true; // 先假設全部相同
        int tmp[n]; // 紀錄除以m的餘數
        for (int i = 0; i < n; i++){
            tmp[i] = sin[i] % m;
            for (int j = 0; j < i; j++){
                if (tmp[j] == tmp[i]){ //一旦找到兩個餘數相同的
                    is_diff = false; //就把is_diff變false
                    break;
                }
            }
            if (!is_diff){
                break; //如果is_diff為false 就不用繼續找了，直接break
            }
        }
        if (is_diff){
            break; //如果is_diff為true 就表示找到了
        }
        m++;
    }
    cout << m << '\n';
    return 0;
}
```
:::

---

### [Kattis - lostlineup](https://open.kattis.com/problems/lostlineup)

撰寫者：fishhh

這題的操作要反過來思考，距離作為陣列的編號，最後在全部讀取出來。

:::spoiler 參考程式碼
```cpp=
#include "iostream"
using namespace std;
int main(){
	int n,k,ary[120]={};
	cin>>n;
	ary[1]=1;
	for(int i=2;i<=n;i++){ 
		cin>>k;
		ary[k+2]=i;
	}
	for(int i=1;i<=n;i++){
		cout<<ary[i]<<" ";
	}
}
```
:::

---

### [No Judge 對稱](https://hackmd.io/@sa072686/cp/%2FaCmrox62TyKBuGzqdZ0e6g#%E5%B0%8D%E7%A8%B1)

撰寫者：fishhh

這裡的寫法很像迴文判斷的寫法，可以注意一下~~~~~~~

以下兩個參考程式差別在於迴圈形式不同

:::spoiler 參考程式1
```cpp=
#include "iostream"
using namespace std;
int main(){
	int n,k,ary[2000]={};
	cin>>n>>k;
	for(int i=0;i<n;i++){
		cin>>ary[i];
	}

	bool yes=1;
	for(int i=0,j=n-1;i<j;i++,j--){ //包夾
		int dif=ary[i]-ary[j];
		if(dif<0)dif=-dif;
		if(k<dif){
			yes=0;
			break;
		}
	}	
	if(yes){
		cout<<"YES\n";
	}
	else{
		cout<<"NO\n";
	}
}

```
:::

:::spoiler 參考程式2
```cpp=
#include "iostream"
using namespace std;
int main(){
	int n,k,ary[2000]={};
	cin>>n>>k;
	for(int i=0;i<n;i++){
		cin>>ary[i];
	}

	bool yes=1;
	for(int i=0;i<n/2;i++){
		int dif=ary[i]-ary[n-i-1];
		if(dif<0)dif=-dif;
		if(k<dif){
			yes=0;
			break;
		}
	}	
	if(yes==1){
		cout<<"YES\n";
	}
	else{
		cout<<"NO\n";
	}
}
```
:::





