發表文章

目前顯示的是 12月, 2023的文章

ZeroJudge D051: 糟糕,我發燒了!

題目敘述 每筆輸入只有一個整數N,要求輸出將華氏N度轉換成攝氏的結果 (精準到小數點後3位)。 範例輸入 104 範例輸出 40.000 解題思路 收資料的時候可以使用float/double來收資料,這樣子可以避免等一下運算時有影性轉型的情況發生。將華氏溫度轉換成攝氏溫度可以用以下公式換算:(N-32) * 5 / 9。輸出時可以使用printf("%.3f\n", ans)來輸出將小數點精準到第三位。

ZeroJudge A282: 認真念書

題目敘述 題目採EOF方式收資料,每筆資料第一行有一個正整數N,第二行會有N個正整數,代表已經讀過的頁數。要求輸出還沒有讀過的頁數中最前面的頁數,詳細請見範例輸入/輸出。 範例輸入 5 1 3 4 5 6 4 1 2 3 4 5 2 3 4 5 6 範例輸出 2 5 1 解題思路 因為題目有明講N不會超過1000且頁數最多為2000頁,所以使用For迴圈從1跑到2000看有哪些頁數還沒讀到就直接輸出目前跑到的頁數然後break迴圈。可以使用Map來存取目前已經讀了哪些頁數,並使用For迴圈來判斷哪些頁數沒有被讀到來求答案,詳情請見範例程式碼。

ZeroJudge D127: 牧場面積

題目敘述 題目採EOF收資料,每筆資料有一個整數N (保證N為偶數),要求輸出當一個方形周長為N時最大面積。 例子:N=14,有6跟1、3跟4,還有很多種排列方式,但是最大的面積為3*4=12。 範例輸入 14 範例輸出 12 解題思路 可使用以下公式來解出這題,公式是使用正數捨去小數點機制做運算 (公式詳見範例程式碼)。需要注意的是本題需要使用long long int來做計算才不會有WA的情況出現。

ZeroJudge A915: 二維點排序

題目敘述 每筆資料第一行有一個正整數N,接下來會有N行每行有兩個整數。要求將每行的數字組合排序後輸出。 範例輸入 4 2 4 1 2 3 4 2 3 範例輸出 1 2 2 3 2 4 3 4 解題思路 將輸入資料存到一個二維陣列或是vector<vector<int>>中,然後使用Algorithm的Sort後輸出陣列中的資料。

ZeroJudge D526: Binary Search Tree (BST)

題目敘述 題目採EOF方式收資料,每筆資料第一行有一個正整數N,第二行會有N個整數。要求建立一個二元搜尋樹然後輸出這個二元搜尋樹。 範例輸入 11 368 115 121 88 741 762 801 34 41 511 60 6 5 2 10 4 9 15 範例輸出 368 115 88 34 41 60 121 741 511 762 801 5 2 4 10 9 15 解題思路 建立一個struct,裡面存目前的值和左右兩邊的資料 (如範例程式碼所示)。將資料輸入之後使用For迴圈將資料一個一個進行判斷是否是要塞到資料結構的左邊還是右邊,如果該方向已經有資料了就要判斷是要在這個資料往右還是往左放,可以使用while(true)來進行判斷,將已經存在的資料往左/右邊推一個,因為struct本身裡面的左右兩邊資料也是struct,所以會形成一個無限的迴圈狀態可以一直塞資料。將二元搜尋樹建立完之後可以使用遞迴將最一開始的struct中的資料輸出,如果有左邊的話就一直往左邊輸出,當左邊沒有資料之後再從最下面往回找有沒有要輸出的右邊,以此類推到樹狀圖最右下角。

ZeroJudge K652: 二元搜尋樹復原 (BST)

題目敘述 每筆測資第一行有一個正整數N,第二行有N個整數,代表這N個數字進行二元搜尋數排序後輸出的結果。要求輸出每個數字在二元搜尋數當中的上一個節點是哪個數字,如果為跟節點的話則輸出-1 (輸出格式請參照範例輸入/輸出)。 範例輸入 8 2 1 6 3 15 19 12 7 範例輸出 1 3 2 1 3 7 6 3 7 -1 12 7 15 19 19 12 解題思路 本題可以參照D526的解題方式,只是從最右邊到最左邊建立二元搜尋樹,當把資料塞到struct裡時,因為二元搜尋樹的資料不是連續的整數,所以可以使用Map把目前數字的上一個節點存起來。當要輸出時,只需使用For迴圈並使用 (auto it:MAP) 來做輸出,當使用auto it:MAP的時候it會變成一個pair的型態,所以只需輸出it.first和it.second即可。本題如果使用endl來輸出的時候可能會遇到TLE的情況出現,所以可以使用cout << "\n"或是scanf/printf來加速。

ZeroJudge A414: 位元運算之進位篇

題目敘述 題目採EOF收資料直到N=0,每筆資料有一個正整數N。要求輸出以二進制計算 N+1 時所需的進位次數,以白話文來講的話就是計算N轉換成二進制之後從最右邊到左邊有幾個連續的1,因為二進制數字只要目前的位數是1加一之後就會需要進位。 範例輸入 1 4 7 17 0 範例輸出 1 0 3 1 解題思路 使用While迴圈將N轉換成二進制的字串,但是這樣子會有TLE的情況出現,所以不將二進制結果存進字串中,而是在While迴圈裡直接進行判斷。因為使用While迴圈轉二進制這個方式會從二進制結果的最右邊開始計算,剛剛好符合題目的要求,所以就是判斷目前得到的數字是否為1,如果是1的話答案就加1,如果是0的話就直接把While迴圈break掉以節省時間。最後輸出存答案的變數即可。要注意的是本題時間給的很緊,所以不建議使用#include <iostream>而是直接使用#include <stdio.h>然後用scanf和printf進行輸入和輸出 (詳情請見範例程式碼)。

ZeroJudge A410: 解方程

題目敘述 每筆資料輸入有一6個整數,分別是a、b、c、d、e、f。 題目要求解出ax + by = c、dx + ey = f的解。輸出的小數點保留至第二位,輸出格式請見範例輸出。如果無解的話輸出"No answer",如果答案有無限多個的時候輸出"Too many"。 範例輸入 1 1 2 1 -1 0 範例輸出 x=1.00 y=1.00 解題思路 可是使用範例程式碼中的公式來解這個方程式。輸出的部分可以使用Stdio.h中的printf("%.2f)來只輸出小數點後兩位,詳情請見範例程式碼。

ZeroJudge A271: 彩色蘿蔔

題目敘述 每筆輸入第一行有一個正整數N,接下來會有N筆資料,每一組資料低一行會有6個正整數:x、y、z、w、n、m。 紅蘿蔔吃了胖x公克,白蘿蔔吃了胖y公克,黃蘿蔔吃了瘦z公克,發霉的蘿蔔吃了瘦w公克(附加狀態:中毒) 中毒會使兔子每天瘦ng(中毒當天不算),且中毒狀態可累加,m是兔子初始的體重。早上先中毒,晚上才吃東西。 接下來會有一行整數。1代表紅蘿蔔,2代表白蘿蔔,3代表黃蘿蔔,4代表黑蘿蔔,0代表沒吃。 範例輸入 4 5 3 2 4 3 10 1 1 2 3 3 3 3 4 3 3 5 3 2 4 3 10 1 1 2 3 3 3 3 4 3 3 2 2 2 2 2 2 2 5 3 2 4 3 10 4 1 3 3 1 1 2 2 1 1 3 1 1 1 1 4 10 3 2 2 1 5 1 4 4 0 0 4 1 2 2 2 0 0 2 2 0 範例輸出 1g bye~Rabbit bye~Rabbit bye~Rabbit 解題思路 使用字串的方式將每筆資料的第二行存起來。接下來可以使用For迴圈將不是空白的字元存到一個陣列裡 (因第二行的整數只會有個位數)。之後再使用For迴圈來做判斷兔子體重的增減。更高階的方式可以使用StringStream來進行解題。要注意的是,一開始cin完6個整數之後要先做一次沒有意義的getline不然getline會失效這點要注意,或者是使用cin.ignore()也可以。為了避免TLE,在做體重增減判斷時,如果已經發現兔子的體重小於0,可以直接把For迴圈break掉,然後使用布林值來判斷是否要輸出兔子當前的體重。

ZeroJudge D365: 10336 - Rank the Languages

題目敘述 每個輸入第一行有一個正整數N,接下來有N筆測資,每筆測資第一行有一個H跟W,代表接下來地圖的高與寬。接下來會有一個H*W的地圖,使用字元/字串的方式來收資料。要求要算出每個字元的領地在地圖中有幾塊。按照地區的數量由小到大輸出,詳情請見範例輸出。 範例輸入 2 4 8 ttuuttdd ttuuttdd uuttuudd uuttuudd 9 9 bbbbbbbbb aaaaaaaab bbbbbbbab baaaaacab bacccccab bacbbbcab bacccccab baaaaaaab bbbbbbbbb 範例輸出 World #1 t: 3 u: 3 d: 1 World #2 b: 2 a: 1 c: 1 解題思路 使用DFS來將每一個點走過一遍來確認地圖上有幾個不同字元的地區,可以用MAP的方式把字元的地區數量存起來。需要注意的是,需要有一個陣列/Vector來紀錄走過的每一個點來避免DFS重複計算的情況。輸出的時候要按照地區的數量由大到小輸出,這時可以將每一個字元和地區數量存在一個Pair裡面,第一個欄位存int,第二個欄位存字元,並把這些Pair存在陣列/Vector裡,這樣就可以用Algorithm的Sort來排序要輸出的資料,最後只要用For迴圈依序輸出即可。

ZeroJudge D190: 11462 - Age Sort

題目敘述 題目採EOF收資料直到N=0終止,每筆資料第一行會有一個正整數N,下一行會有N個整數。要求將這N個整數排序後由小到大輸出。 範例輸入 5 3 4 2 1 5 5 2 3 2 3 1 0 範例輸出 1 2 3 4 5 1 2 2 3 3 解題思路 將需要排列的整數收到一個陣列/Vector裡,再使用Algorithm中的sort來進行排序,最後使用For迴圈從第0個資料到第N-1個資料依序輸出。本題即使不使用cin加速/scanf也可以AC。

ZeroJudge A263: 日期差幾天

題目敘述 題目採EOF收測資。每個測資有兩行,每一行有三個正整數分別代表年、月、日,要求算出這兩個日期差了幾天。 範例輸入 2011 10 19 2011 10 18 範例輸出 1 解題思路 將兩個日期換算成「天」這個最小單位。要注意的是需要判斷閏年出現的次數,也要判斷當前的月份需不需要計算閏年的多一天。最後輸出兩個天數相減的絕對值 (不需判斷大小) 即可。

ZeroJudge A248: 新手訓練 ~ 陣列應用

題目敘述 題目採EOF輸入測資,每行有三個正整數a、b、N。要求輸出 a/b 的運算結果並且計算到小數點第N位。第N位以後無條件捨去。 範例輸入 18467 41 10 26500 6334 10 15724 19169 10 10 5 3 範例輸出 450.4146341463 4.1837701294 0.8202827481 2.000 解題思路 本題如使用cin需先優化避免超時。輸出完整數的答案後跑For迴圈跑到第N位進行計算並輸出計算結果。

ZeroJudge A244: 新手訓練 ~ for + if

題目敘述 每個測資第一行有一個正整數N,接下來有N行,每行有三個數字A、B、C。 如果 a = 1  請輸出  b+c  如果 a = 2  請輸出  b-c  如果 a = 3  請輸出  b*c  如果 a = 4  請輸出  b/c   結果請用整数輸出 範例輸入 4 1 2 3 2 2 3 3 2 3 4 2 3 範例輸出 5 -1 6 0 解題思路 本題需使用long long int避免超出int計算範圍。使用if判斷式來判斷要使用加減乘除哪一個來進行輸出。

ZeroJudge A224: 明明愛明明

題目敘述 題目採EOF輸入測資,每一行有一個沒有空白字元的字串,如果字串重組後可以變成迴文則輸出「yes !」,反之則輸出「no...」。 標點符號不再迴文判斷範疇內,大小寫英文字母皆為相同的字元 (例:A = a)。 範例輸入 ababa bbaaa Level aaabbbcc abcdefg HowAreYouToday A_man,_a_plan,_a_canal:_Panama. 範例輸出 yes ! yes ! yes ! no... no... no... yes ! 解題思路 因為題目的要求為「可重組」,所以就要使用迴文的定義來判斷字串是否可以組成一個迴文。在迴文中,每一個字元都是雙雙成對的,除非字串長度為奇數則最中間的字元為非成對出現。所以可以利用MAP來統計每一個字元所出現的次數,並且使用「isalpha(str[i])」和「tolower(str[i])」來判斷目前的字元是否是英文字母且強制將所有英文字母轉換為小寫來避免大小寫判斷問題。迴圈結束後從0到26跑一次For迴圈來確定每一個英文字母的MAP值都是偶數,如果有超過一個字母為非偶數的情況 (剛剛講到的中間字元非成對出現的狀況),則此字串不可變成迴文。

ZeroJudge A215: 明明愛數數

題目敘述 題目採EOF輸入測資,每一行會有一個N和M。要求輸出一個數K,N+(N+1)+(N+2)+... (N+K) >= M。 範例輸入 1 5 5 10 100 1000 範例輸出 3 2 10 解題思路 使用For迴圈將N到N+K的所有數加在一起,For迴圈的迴圈條件改為sum <= M。當迴圈終止後輸出變數K即可。

ZeroJudge A149: 乘乘樂

題目敘述 輸入第一行有一個數字N,接下來會有N行每行輸入一個數字。將每個數字的位數數字乘起來並輸出。 範例輸入 3 356 123 9999 範例輸出 90 6 6561 解題思路 使用字串 (String) 的方式來收數字,並且使用For迴圈講每一個位數的數字乘在一起 (可利用 int(str[j] - '0') 來將字元轉換成整數型態),For迴圈結束後即輸出答案。要注意的是存答案的變數預設值需設定為1不是0,這樣才不會一直乘以0導致所以答案都是0。

ZeroJudge A148: You Cannot Pass?!

題目敘述 題目採EOF收資料方式處理,每行第一個數字 N 為接下來所需要收的成績數量。當 N 個數字的平均值 (需使用Float/Double進行計算) 「大於」59的話就輸出「no」,反之則輸出「yes」。 範例輸入 1 60 3 0 80 75 5 61 61 61 61 55 範例輸出 no yes no 測資解釋 第一行的第一個數為1,代表接下來要收1個數字。因為60>59所以輸出no。 第二行的第一個數為3,接下來收的3個數字分別為 0、80、75,三個數的平均值為51.6。因為51.6沒有大於59,所以輸出yes。 第三行思路和第二行相同,五個數字的平均值為59.8,因為大於59所以輸出no。