---
# System prepended metadata

title: 自主學習

---

==9/7==

1.d073
電腦課要同學分組做期末報告，分組的方式為依座號順序，每3個人一組。如：1,2,3為第一組，4,5,6為第二組…。輸入同學的座號，請判斷他在哪一組。

:::info
輸入:一個正整數，代表同學的座號。
輸出:該同學的組別。
:::

```
//我的想法
#include <iostream>
using namespace std;
int main()
{   int n,x,a;
    while(cin>>n)
    {   x=n%3;
        if(x>0)
        {   a=(n/3)+1;
        }
        else
        {   a=n/3;
        }
        cout<<a<<endl; 
    }
}
```

```
//解題報告
#include <iostream>
using namespace std;
int main()
{   int a;
    while(cin>>a)
    {   cout<<(a-1)/3+1;
    }
}
```

悄悄話:解題報告的方法我真的沒辦法自己想到，感覺變成是數學題(?

---

2.b877
我愛看電視，更愛切頻道，可恨的是遙控器上的所有按鍵全壞光了，只剩下「下一個頻道」可以用。我的電視有100個頻道，編號為0~99。給你我現在正在看的頻道，以及我要切換過去的頻道，請問我得按幾次「下一個頻道」。

:::info
輸入:只有一行，含兩個整數，分別代表現在的及要切換過去的頻道。
輸出:所需按「下一個頻道」的次數。
:::

```
//我的想法
#include <iostream>
using namespace std;
int main()
{   int a,b,x;
    while(cin>>a>>b)
    {   if(b-a>0)
        {   x=b-a;
        }
        else
        {   x=b-a+100;
        }   
        cout<<x<<endl;
    }
}
```

```
//解題報告
#include <iostream>
using namespace std;
int main()
{   int a,b;
    while(cin>>a>>b)
    {   cout<<(a<b?b-a:100+b-a)<<endl;
    }
}
```

:::danger
cout<<(條件?成立:不成立)
:::

---

3.d060
文文又想打電話給珊珊，可是這次他碰到了另一個問題。珊珊說他們學校每堂課50分鐘，下課的時間都是整點過後25分，休息10鐘後再上下一節課。文文不想打擾珊珊上課，也不想才剛打通電話她就要上課去了，因此他決定一定要在剛好25分的時候打電話給她。給你現在的時間的分，請你幫他算算看還要等多久才能打電話給珊珊？

:::info
輸入:只有一行，包含現在時間的分。
輸出:還要等幾分鐘文文才能打電話。
:::

```
//我的想法
#include <iostream>
using namespace std;
int main()
{   int a;
    while(cin>>a)
    {   cout<<(a<=25?25-a:60+25-a)<<endl;
    }
}
```

悄悄話:用上一題的方法馬上就解決了，不過第一次在「a<=25」錯了

---

==心得==

第一周寫的題目比較簡單，漸漸找回以前學過的記憶，沒有老師帶著自己寫題目感覺蠻不一樣的，正在慢慢摸索怎麼做的更好。
這次學到的新工具:程式碼專區。

---

==9/14==
1.d498
文文小學時因交友不慎，學會了說髒話。有一天他說髒話時被老師聽到了，結果被罰在黑板上寫 n 遍「I don't say swear words!」
            
:::info
輸入:只有一行，其中含有一個正整數 n，代表文文被罰寫的次數。
輸出:n行「I don't say swear words!」
:::
                   
```
//我的想法
#include <iostream>
using namespace std;
int main()
{   int n,i;
    while(cin>>n)
    {   for(i=0;i<n;i++)
        {   cout<<"I don't say swear words!"<<endl;
        }
        
    }
}
```

---
    
==心得==
    
開始研究hackmd的功能，所以這周寫題目的時間比較少，而且我忘記帶以前的上課筆記本到資訊教室，下次要把缺的題目還有整理補上來。
這次學到的新工具:插入水平線。
    
---
    
==9/21==
    
1.d511
小明這學期的數學課教到了三角形，於是老師給了他們一個作業，這個星期一到星期五每個人上學時都要帶三根樹枝到學校來，如果那三根樹枝可以構成一個三角形，那天就可以加一分。給你小明所帶樹枝的長度，請你幫他看看他可以加幾分？
    
:::info
輸入:一共有 5 行，每行有 3 個整數，代表當天小明所帶的樹枝的長度。
輸出:一個整數，代表小明可以加幾分。 
:::
    
```
//解題報告
#include <iostream>
using namespace std;
int main()
{   int i,a,b,c;
    int x=0;
    for(i=1;i<=5;i++)
    {   cin>>a>>b>>c;
        if(a+b>c&&b+c>a&&a+c>b)
        {   x=x+1;
        }
    }
    cout<<x;
}
```
    
---  
    
==心得==
    
依然花了時間繼續研究hackmd，排版的時候強迫症一直發作，所以時間一下子就過了，然後現在還不是我最滿意的版本，以後很有可能會改。
這次學到的新工具:螢光標記和色塊。

---
    
==9/28==

1.a005
Eva的家庭作業裏有很多數列填空練習。填空練習的要求是：已知數列的前四項，填出第五項。因 為已經知道這些數列只可能是等差或等比數列，她決定寫一個程式來完成這些練習。
    
:::info
輸入:第一行是數列的數目t（0<=t<=20)。以下每行均包含四個整數，表示數列的前四項，約定數列的前五項均為不大於105的自然數，等比數列的比值也是自然數。
輸出:對輸入的每個數列，輸出它的前五項。
:::
    
```
//我的想法
#include <iostream>
using namespace std;
int main()
{   int n,a,b,c,d,e;
    while(cin>>n)
    {   for(int i=0;i<n;i++)
        {   cin>>a>>b>>c>>d;
            if(d-c==c-b)
            {   e=d+d-c;
            }
            else    
            {   e=d*(d/c);
            }
            cout<<a<<" "<<b<<" "<<c<<" "<<d<<" "<<e<<endl;
        }
    }
}
```
    
---
    
==心得==
    
寫題目開始遇到瓶頸了，決定多多查資料看能不能學到新技能，zerojudge不知道為什麼不能送出解答 也不能看解題報告了，拜託趕快恢復正常。
    
--- 
    
==10/5==
    
1.i399
給三個介於1~9的整數A1,A2,A3。先輸出一個正整數P表示眾數數量，也就是出現最多次的數字的次數。
接下來將輸入的三個數字去除重複（剩下一個）後由大到小依序輸出。
    
:::info
輸入:三個介於1~9的整數。
輸出:先輸出一個數值P表示出現最多次的數字個數，接下來將輸入的三個數字去除重複（剩下一個）後由大到小依序輸出。
::: 
    
---
    
==心得==
    
zerojudge還是不能送出送出解答

--- 
    
==10/19==
      
1.d570
給你一個正整數，請逐次去掉尾數並顯示出來。
    
:::info
輸入:只有一行，含有一個正整數n (1≤n≤2147483647)。
輸出:n如果有k位數，就輸出k行，第一行輸出n，第二行以後每行都比上一行少一個尾數。
:::
    
```
//解題報告
#include <iostream>
using namespace std;
int main()
{   int n;
    cin>>n;
    while(n!=0)
    {   cout<<n<<endl;
        n=n/10;
    }
}
```
    
悄悄話:我忍不住偷看解題報告
    
---
    
==心得==
    
我決定創了個新帳，現在終於可以送出解答了
    
--- 
==10/26==
    
1.d065
文文和兩個同學最近喜歡在 ZeroJudge 上解題。有一天他們看到了孔子說的：「三人行必有我師焉。」就吵了起來，因為他們每個人都認為自己是三個人之中的「老師」。後來他們決定要比比看誰在 ZeroJudge上的AC題數最多。
    
:::info
輸入:只有一行，含有三個由空白所隔開的非負整數。
輸出:這三個整數中最大的那一個。
:::
    
```
//我的想法
#include <iostream>
using namespace std;
int main()
{   int a,b,c;
    while(cin>>a>>b>>c)
    {   if(a>=b&&a>=c)
        {   cout<<a<<endl;
        }
        else if(b>=a&&b>=c)
        {   cout<<b<<endl;
        }
        else
        {   cout<<c<<endl;
        }
    }
}
```
    
:::danger
|| 或
&& 且 
:::   
--- 
    
==心得==
    
這節被我蹺掉去做海報了
    
---
    
==11/2==
     
1.c418
Bert想要一個n層的三角形，第i層就要有i個*
    
:::info
輸入:單筆輸入，只有一個整數n (1<=n<=100)
輸出:整個三角形
:::
    
```
//我的想法
#include <iostream>
using namespace std;
int main()
{   int a;
    while(cin>>a)
    {   for(int i=1;i<a+1;i++)
        {   for(int j=0;j<i;j++)
            {   cout<<"*";
            }
            cout<<endl;
        }
    }
}
```
    
2.c419
Bert又想要另外一種n層的三角形，第i層一樣要有i個*，但要向右對齊
    
:::info
輸入:單筆輸入，只有一個整數n (1<=n<=100)
輸出:整個三角形(因為空格不好辨識，請以_代替)
:::
    
```
//我的想法
#include <iostream>
using namespace std;
int main()
{   int n,i,j,k;
    while(cin>>n)
    {   for(i=1;i<n+1;i++)
        {   for(j=n-i;j>0;j--)
            {   cout<<"_";
            }
            for(k=n-i;k<n;k++)
            {   cout<<"*";
            }
            cout<<endl;
        }
    }
}
```
                       
悄悄話:我憑著一點點的記憶完全自己寫出來的開心
                       
---
                       
==心得==
   
字為什麼會亂變色，還有換行的時候空那麼多格
                       
---
==11/9==
  
1.c420
Bert有天騎著海豚到了埃及，看到了金字塔不經意的發出哇!現在Bert想請你用程式記下金字塔的樣子，有一種n層的三金字塔，定義如下:第i層要有相對數量的*，請注意要像金字塔一樣向中間對齊
                       
:::info
輸入:單筆輸入，只有一個整數n (1<=n<=100，為奇數)
輸出:整個三角形(因為空格不好辨識，請以_代替)
:::
                               
```
//我的想法
#include <iostream>
using namespace std;
int main()
{   int n,i,j,k,l,m;
    while(cin>>n)
    {   for(i=1;i<n+1;i++)
        {   for(j=n-i;j>0;j--)
            {   cout<<"_";
            }
            for(k=n-i;k<n;k++)
            {   cout<<"*";
            }
            for(l=n-i;l<n-1;l++)
            {   cout<<"*";
            }
            for(m=n-i;m>0;m--)
            {   cout<<"_";
            }
            cout<<endl;
        }
    }
}
```
    
---
    
==心得==
    
這次的內容是假日補的!這題應該要馬上解決的結果我又不仔細看題目，可以說是亂繞了一大圈，以後先好好看題目，仔細思考過再開始慢慢嘗試，不要太急!
    
---
    
==11/16==
    
1.d583 
小企鵝總是天真可愛，但擺脫不了幾分幼稚。現在企鵝幼稚園的企鵝老師要小企鵝任意排隊。而小企鵝們卻很堅持要照老師給他們的座號來排隊，偏偏有的小企鵝就是會忘記自己的座號亂排，於是可以想見的是一群短鳥喙的小企鵝爭吵互啄的景象了…
    
:::info
輸入:每組測資的第一行有整數n (1<=n<=100000)代表有幾隻企鵝。第二行則有n個數字的數列代表每隻企鵝的座號，並且座號必定有1~n不重覆。
輸出:請由小到大輸出已經排序的數列。
:::
    
```
//我的想法
#include <iostream>
using namespace std;
int main()
{   int n,i,j,z;
    while(cin>>n)
    {   for(i=1;i<n+1;i++)
        {   cin>>z;
        }
        for(j=1;j<n+1;j++)
        {   cout<<j<<" ";
        }
        cout<<endl;
    }
}
```
                   
悄悄話:感覺有點偷吃步，直接把1到n照順序輸出。
                   
---  
                   
==心得==
                   
其實現在寫的題目都超級無敵簡單，以前上過的內容記憶差不多都找回來了，反正這學期一定要練到APCS考古題。
                   
---
                   
==11/23==
    
1.d124
pascal語言有了一種新的類型int128。它能够運算10000位的超大數據。
輸入一个類型為int128的數字ｎ，判斷它是否為3的倍數。
                   
:::info
輸入:輸入檔中有多個數據，每組數據占一行，是輸入的數n。
輸出:若是輸出yes，若不是輸出no。
:::

```
//解題報告
#include<iostream>
using namespace std;
int main()
{   string s;
    while(cin>>s)
    {   int sum=0;
        if(s[0]=='-')
        {   s[0]=0;
        }
        for(int i=0;i<s.size();i++)
        {   sum+=s[i]%3;
        }
        if(sum%3==0)
        {   cout<<"yes"<<endl;
        }
        else
        {    cout<<"no"<<endl;
        }
    }
}
```

悄悄話:這題應該要去學string字串

---  
                   
==心得==
                   
昨天是管樂市賽!下週就段考了，但是比起讀書我真的更想做這個，其實自主學習選做c++我覺得越來越有趣，沒有後悔，雖然我寫的題目都是超簡單基本題哈哈哈。

--- 
                   
==12/7==
    
1.b758
蛋塔因為上次搞混了講義而感到很愧疚，決定去西部闖蕩一番，他總聽說西部牛仔都會在原野上騎著馬，但他到了台灣的西部只看到一片繁榮的都市，感到相當困惑，正當他因為招攬不到計程車又沒朋友而哭出來的時候，一名冷酷的女士將他撿了回去。
女士名叫阿蕙(36)，聽了蛋塔的故事後決定讓他暫時留在家裡吃住，阿蕙對蛋塔相當好，讓蛋塔不知不覺間也開始叫他馬麻，但好景不常，蛋塔犯了一個致命的失誤，差點讓他從家裡被趕出去，沒錯，就是打擾馬麻的午覺時間，馬麻下午總是在臉上敷上幾根青椒，安穩的睡在沙發上，要是睡覺時間內的兩個半小時被吵起來，就會發生相當恐怖的事，現在蛋塔看到馬麻開始休息了，可以告訴他甚麼時候才能把馬麻家的PS6打開超大聲玩遊戲嗎?

:::info
輸入:只有一行，兩個數字XY，以空白區隔，代表現在時間X:Y
輸出:只有一行，H:M，代表H:M才能把馬麻吵醒(HM都要印兩位數，如果是個位數要補0)
:::

```
//我的想法
#include<iostream>
#include<iomanip>
using namespace std;
int main(){   
    int a,b,h,m;
    while(cin>>a>>b){   
        if(b<30){   
            m=b+30;
        }
        else{   
            m=b+30-60;
            a=a+1;
        }
        if(a<22){   
            h=a+2;
        }
        else{   
            h=a+2-24;
        }
        cout<<setfill('0')<<setw(2)<<h<<":"<<setw(2)<<m<<endl;
    }
}
```

:::danger
#include<iomanip>
setfill('0') 空位補0
setw(2) 輸出兩位
:::
                                                   
---
                                                   
==心得==

心得寫不出來，不過最近狀態還挺好，看來應該要開始研究APCS的題目了。
                                                   
---   

==12/14==

1.h081
小明最近想要用程式做股票交易，給一個股票的歷史價格a[1]、a[2]...a[n]，他的投資策略如下。
1:同一個時間最多只會持有一張股票, 並會在時間點1花a[1]買進。
2:若當下持有股票且該股票買進價格為x，當遇到價格y大於等於x+D時即賣出，並賺得利潤y-x。
3:若當下沒有持有股票且上一次的賣出價格為x，當遇到價格y小於等於x+D時則會買進股票。
輸出依照上述規則買賣後所得到的利潤和，若交易結束仍持有股票，則不考慮該股票買進的成本，直接無視該股票即可。
:::info
輸入:第一行輸入兩個正整數n、D，接下來有n個正整數，代表每個時間點股票的價格。
輸出:一個正整數，代表總利潤。
:::   
https://github.com/CBJ0519/CBJsProgramDiary.com/blob/main/APCS/h081.cpp

---
==心得==
我覺得...嗯...我努力看看。
                                                   
---  
==12/21==
2.h082
有n人要比賽，每個人的戰力為S[1]、S[2]...S[n]，而應變力為T[1]、T[2]...T[n]，編號為1到n。
一開始將這n個人按照編號為idx[1]、idx[2]...idx[n]的順序排成一列，並從陣列前端開始兩兩一組進行配對競賽，若該round有奇數人數，則最後一個落單的人直接晉級下一round，並不獲得戰力和應變力數值的增加。                                                 
每一場競賽的勝負判斷規則如下，假設第一個人的戰力為a，應變力為b，第二個人的戰力為c，應變力為d。
1:若ab>=cd則第一個人獲勝，並且勝利方(第一個人)的戰力變為a+cd/(2b)，應變力變為b+cd/(2a)，失敗方(第二個人)的戰力變為c+c/2，應變力變為d+d/2。
2:若ab<cd則第二個人獲勝，並且勝利方(第二個人)的戰力變為c+ab/(2d), 應變力變為d+ab/(2c)，失敗方 (第一個人) 的戰力變為a+a/2，應變力變為b+b/2。
以上除法皆為無條件捨去。
該round每組勝負揭曉後，按照原有順序將他們排列並分成勝利組和失敗組，失敗組中若有人已經輸了m次則被淘汰，再將失敗組接在勝利組之後形成新的排列進行下一round，直到僅剩一個人成為最終勝利者，並輸出他的編號。

:::info
輸入:第一行輸入兩個正整數n、m，接下來一行有n個正整數代表每個人分別的戰力值，接下來一行有n個正整數代表每個人分別的應變力值，最後一行有n個正整數代表第一round的初始排列順序。
輸出:最終贏家的編號。
:::   
https://cbjsprogramdiary.com/2022/12/11/h082-2-%e8%b4%8f%e5%ae%b6%e9%a0%90%e6%b8%ac/

---
                                           
==心得==

這周有排球聯賽欸，不過我沒去看而是在這裡繼續改HackMD
                                                   
---
==12/28第十八周==
3.h083
占卜籤筒有m支籤，每一支籤為一個由英文小寫字母組成的字串。從籤筒內抽出兩支籤，若將這兩支籤上的字串S和T連接起來形成的字串可以將該字串拆成左右兩半並且內容一樣，則抽到聖筊代表神明同意，否則神明不同意或是沒回答。
例如抽出的兩支籤上的字串分別為piep和ie，則相連接起來的字串為piepie可以拆分左右兩半為相同的字串pie和pie，但抽出的兩支籤為foo和bar時則不滿足條件。
神奇的是，若抽到的兩支籤S和T為聖筊，則不管是將T接在S後面或是順序反過來接起來，都可以是聖筊，再次說明了這兩支籤有著某種神秘力量在祝福著抽到的幸運人。例如piep和ie不管是使用piepie或是iepiep都可以拆分成兩個一樣的字串。
詢問籤筒內這m支籤，有幾個pair可以形成聖筊。相同的兩支籤組合計算一次即可。

:::info
輸入:一個正整數m，接下來有m的字串，每個字串長度最長為100。
輸出:一個正整數，代表有幾個pair滿足條件。
:::   
https://ithelp.ithome.com.tw/articles/10285351

---

==心得==
今天複製貼上我亂寫的心得，很意外的我的完成率還挺高，雖然寫的好像都是廢話

---

==1/4第十九周==
4.h084
有一個由n個木板所組成的柵欄，每個木板的高度為h[1]、h[2]...h[n]，有k張海報要張貼在柵欄上，每張海報的寬度為w[1]、w[2]...w[n]並且高度均為1。
若要張貼海報在高度為x的高度，則第i張海報需要張貼在一個長度為w[i]的連續並且高度都不小於x的木板上，且每張海報張貼的高度需要一致、按照順序並不能重疊(可以相連)。詢問最高可以貼到多高的位置。

:::info
輸入:第一行有兩個正整數n、k，接下來一行有n個正整數代表每個木板的高度，最後一行有k個正整數代表每張海報的寬度。
輸出:最大可以張貼的高度。
:::   

---

==1/11第二十周==

1.e621
小花年輕時總是開車上班，深深了解停車位一位難求、停車場叉十分昂貴的民間疾苦。他現在退休租了一塊地當起停車場主人，為了體諒年輕人賺錢不易決定每個禮拜選幾天抽出免停車費的車位回饋社會。
他的抽法如下：先選出一個區間，再由此區間中剔除可以被某個數字整除的車位，剩下的即為免費車位。為了搶到免費的停車位，請你寫一支程式迅速地找出免費車位號碼。
:::info
輸入:第一行輸入一個正整數N，表示這個禮拜要選擇幾天放送優惠；接下來的N行每行輸入3個整數ABC(0≤A<B≤500,1≤C≤B)。
輸出:共輸出N行，對於每一天的資料輸出一行符合「大於4、小於B、且不被C整除」的所有車位號碼，以空白區隔，若無符合之車位則輸出「No freeparking spaces.」
:::