# 黎明高中資訊社第三次平時考 --- ## 目錄: > [TOC] ## 說明: 社長或副社長將從itsa或者zero judge挑選出4至5題的題目,基本上都不會選有出現在資訊社資源目錄的,難度隨題號遞增,在社團課抑或週六課程時將驗收,選擇自己會寫的先做,目前都是你們能夠解決的。 ## 完成者填寫說明: 若已答題且正確完畢,請寫上自己的姓名,可以自己新增更多名次(如第一題有到11名,可以繼續增加),有空社長將抽查答對者的想法與程式,一切採自由心證,當然我回去看報表核對。 ## 時間: 2020/05/30至2020/06/11 <10 p.m> ## 獎勵: 很讚的東西。 ## 社長的話: <font color="#DC143C">上次的資訊段考,太簡單?因為:</font> ![](https://i.imgur.com/mqzazQH.png) <font color="#800080">但是這次有讓你連輸入都不知道怎麼輸入的題目:</font> ![](https://i.imgur.com/WqBdZwI.jpg) > [name=風思] > [time=Sat, May 30, 2020 8:17 PM] > [color=#f55f] ## 解答: 已以釋出。 --- ### 1.<font color="#99FF">[C_AR97-易] 矩陣分素乘積</font> #### =>[題目連結](https://e-tutor.itsa.org.tw/e-Tutor/mod/programming/view.php?a=6471) #### 問題敘述: 寫一個程式輸入兩個相同維度的矩陣,求得兩矩陣的分素乘積( entrywise product )。兩個 mxn 矩陣 A 與 B 的分素乘積 A 。 B ,定義為 (A 。 B)ij=aijbij 。例如, ![](https://i.imgur.com/5mJ4h16.jpg) ### 完成者: 1. <社長> > [time=Sat, May 30, 2020 8:12 PM] 2. <張嘉元> > [time=Sat, May 30, 2020 11:05 PM] 3. <吳冠毅> > [time=Tue, Jun 2, 2020 10:41 AM] > 想當不測試的真男人還是失敗了 4. <吳品範> > [time=Wed, Jun 3, 2020 10:38 AM] 5. <陳宜俊> > [time=Wed, Jun 3, 2020 10:40 AM] 6. <何承煜> > [time=Wed, Jun 3, 2020 11:24 AM] 7. <柯昀杰> > [time=Wed, Jun 3, 2020 11:55 AM] 8. <陳寬仁> > [time=Wed, Jun 3, 2020 11:55 AM] 9. <李晨維> > [time=Sat, Jun 6, 2020 1:00 PM] 10. <胡韡薰> > [time=Sat, Jun 6, 2020 2:36 PM] #### 社長提供的測資: ``` input: 8 8 1 2 3 4 5 6 7 8 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 1 3 5 7 2 4 6 8 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 1 3 5 7 2 4 6 8 1 2 3 4 5 6 7 8 1 3 5 7 2 4 6 8 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 1 3 5 7 2 4 6 8 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 1 3 5 7 2 4 6 8 1 2 3 4 5 6 7 8 ``` ``` output: 1 6 15 28 10 24 42 64 81 64 49 36 25 16 9 4 1 4 9 16 25 36 49 64 1 9 25 49 4 16 36 64 81 64 49 36 25 16 9 4 1 4 9 16 25 36 49 64 1 9 25 49 4 16 36 64 1 4 9 16 25 36 49 64 ``` ### 參考解答(社長提供): #### ```cpp= #include <bits/stdc++.h> using namespace std; int main(){ int m,n; while(cin >> m >> n){ int A[m][n]; int B[m][n]; for(int i=0; i<m; i++) for(int j=0; j<n; j++) cin >> A[i][j]; for(int i=0; i<m; i++) for(int j=0; j<n; j++) cin >> B[i][j]; for(int i=0; i<m; i++){ for(int j=0; j<n; j++){ if(j==0) cout << A[i][j]*B[i][j]; else cout << " " << A[i][j]*B[i][j]; } cout << endl; } } return 0; } ``` ### 參考解答(社員提供): --- ### 2.<font color="#E3FF33">[C_AR94-易] 洗刷刷</font> #### =>[題目連結](https://e-tutor.itsa.org.tw/e-Tutor/mod/programming/view.php?a=6427) #### 問題敘述: 請撰寫一個與電腦比賽的洗刷刷遊戲程式。遊戲規則 : 你可以出 1.2.3.4.5 這五個數字 1 比 5 大、 2 比 1 大、 3 比 2 大、 4 比 3 大、 5 比 4 大,看你和對方出的誰比較大誰就 贏 了,但是要記住。例如 5 比 4 大, 4 比 3 大,但是 5 沒有比 3 大,以此類推,就是每個數目都只有一個比他小的和一個比她大的。 輸入一連串數字為甲方的數字,輸入一連串數字為乙方的數字,兩者相比,判斷贏、輸或和局。 ### 完成者: 1. <社長> > [time=Sat, May 30, 2020 8:12 PM] 2. <吳冠毅> > [time=Tue, Jun 2, 2020 11:06 AM] 3. <吳品範> > [time=Wed, Jun 3, 2020 11:13 AM] 4. <陳宜俊> > [time=Wed, Jun 3, 2020 11:29 AM] 5. <何承煜> > [time=Wed, Jun 3, 2020 11:46 AM] 6. <李晨維> > [time=Wed, Jun 3, 2020 11:56 AM] 7. <張嘉元> > [time=Sat, Jun 6, 2020 2:09 PM] 8. <柯昀杰> > [time=Sat, Jun 6, 2020 2:27 PM] 9. <胡韡薰> > [time=Tue, Jun 9, 2020 10:58 AM] #### 社長提供的測資: ``` input: 12542524212323133212121244 11345131425241321424132141 ``` ``` output: 和贏和和和輸輸和和輸和贏和和和贏和和輸和和輸輸贏和和 ``` ### 參考解答(社長提供): #### C++: ```cpp= #include <iostream> #include <cmath> using namespace std; int main(){ string str1,str2; int num1,num2; int flag;//1=甲贏,0=平手,-1乙贏 while(cin >> str1 >> str2){ for(int i=0; i<str1.length(); i++){ num1=str1.at(i)-'0'; num2=str2[i]-'0'; if(num1==1 and num2==5) flag=1; else if(num1==5 and num2==1) flag=-1; else if(num1==num2 or abs(num1-num2)>1) flag=0; else flag=(num1-1==num2)?1:-1; switch(flag){ case 1: cout << "贏"; break; case 0: cout << "和"; break; case -1: cout << "輸"; break; } } cout << endl; } return 0; } ``` ### 參考解答(社員提供): --- ### 3.<font color="#FF7433">[C_SO45-易] 混合數列</font> #### =>[題目連結](https://e-tutor.itsa.org.tw/e-Tutor/mod/programming/view.php?a=11533) #### 問題敘述: 有兩個數列 x =3^1, 3^2, 3^3,.... 及 y = 4^1, 4^2, 4^3,... 。將兩個數列混合成一個數列 z ,裏面的數字由小排到大。請你寫一個程式,輸出 z 數列的第 k 項,以及前 k 項的合。 例如 k =6 ,則 z 的前 6 項為 3,4,9,16,27,64 。所以第 k 項為 64 ,且前 k 項的合為 123 。 在這個題目中,假設 k <=50. ### 完成者: 1. <社長> > [time=Sat, May 30, 2020 8:12 PM] 2. <張嘉元> > [time=Sun, May 31, 2020 2:06 PM] > 放棄社長測資的人 3. <吳冠毅> > [time=Wed, Jun 3, 2020 11:13 AM] 4. <吳品範> > [time=Sat, Jun 6, 2020 12:44 PM] 5. <李晨維> > [time=Sat, Jun 6, 2020 1:22 PM]滑鼠好難用,腦袋更難 6. <陳宜俊> > [time=Sat, Jun 6, 2020 2:29 PM] 7. <柯昀杰> > [time=Sat, Jun 6, 2020 8:20 PM] > 50還是跑不出來 #### 社長提供的測資: 雖然k最大50,但500跑得出來才行! ``` input: 50 500 ``` ``` output: 22876792454961,57771436741660 13086697590606049996055584044927596411194063175701640828433332451808337095546592569711085360860462837129622486793968164469385350610944,34772519808734217706618156541975932553872434308141159656813273390712961896118752966620210472553608828039306159443297283111318433300480 ``` ### 參考解答(社長提供): #### C++: ```cpp= #include <iostream> #include <iomanip> #include <cmath> using namespace std; int main(){ int k; double temp_3,temp_4,count_3,count_4,last,sum; while(cin >> k){ count_3=1;count_4=1;sum=0; while(k--){ temp_3=pow(3,count_3); temp_4=pow(4,count_4); if(temp_3<temp_4){ sum+=temp_3; last=temp_3; count_3++; } else{ sum+=temp_4; last=temp_4; count_4++; } } cout << setprecision(0) << fixed <<last << "," << sum << endl; } return 0; } ``` ### 參考解答(社員提供): --- ### 4.<font color="FF5233">[C-AR140-易] 求最大糧食產量</font> #### =>[題目連結](https://e-tutor.itsa.org.tw/e-Tutor/mod/programming/view.php?a=12121) #### 問題敘述: 有一張 MxN 的地圖,我們現在想要在地圖上挑一個地方建設城市,城市建設下去後,以城市為中心,向外拓展,不走斜角進行移動; 兩格的移動範圍內 ( 超出地圖的部分不計算 ) ,將成為城市腹地。請設計一個程式,當輸入每格的糧食產量 (1~5 ,包含城市本身 ) 後,能自動挑選出最佳的城市位址,使城市的腹地範圍內擁有最大的糧食產量,並輸出。 ### 完成者: 1. <社長> > [time=Sat, May 30, 2020 8:12 PM] 2. <吳冠毅> > [time=Wed, Jun 3, 2020 11:58 AM] 3. <吳品範> > [time=Sat, Jun 6, 2020 1:52 PM] 4. <陳宜俊> > [time=Sat, Jun 6, 2020 3:34 PM] #### 社長提供的測資: 突破題目限制的測資。 ``` input: 8 8 1 2 3 8 6 4 2 1 9 3 5 6 7 8 9 2 1 2 3 4 5 6 7 8 6 4 3 2 1 3 3 2 9 9 9 9 8 8 7 7 1 0 0 0 9 8 6 4 8 8 8 8 8 8 8 8 6 3 8 3 2 0 0 0 ``` ``` output: 83 ``` ### 參考解答(社長提供): #### Java: ```java= import java.util.*; //[C-AR140-易] 求最大糧食產量 //2019,08,27;18:41 public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int M = sc.nextInt(); int N = sc.nextInt(); // 陣列擴充兩環 int[][] arr = new int[M + 4][N + 4]; int sum = 0; int up, down, left, right; int upperight, loweright, upperleft, lowerleft; int up_2, down_2, left_2, right_2; int[] result = new int[M * N]; for (int i = 2; i <= M + 1; i++) for (int j = 2; j <= N + 1; j++) arr[i][j] = sc.nextInt(); for (int i = 2, k = 0; i <= M + 1; i++) { for (int j = 2; j <= N + 1; j++) { sum = 0; up = arr[i - 1][j]; down = arr[i + 1][j]; left = arr[i][j - 1]; right = arr[i][j + 1]; upperight = arr[i - 1][j + 1]; loweright = arr[i + 1][j + 1]; upperleft = arr[i - 1][j - 1]; lowerleft = arr[i + 1][j - 1]; up_2 = arr[i - 2][j]; down_2 = arr[i + 2][j]; left_2 = arr[i][j - 2]; right_2 = arr[i][j + 2]; sum += arr[i][j] + up + down + left + right + upperight + loweright + upperleft + lowerleft + up_2 + down_2 + left_2 + right_2; result[k++] = sum; } } Arrays.sort(result); // 印出最後一個(最大值) System.out.println(result[result.length - 1]); sc.close(); } } ``` ### 參考解答(社員提供): --- ### 5.<font color="#f00">[C_GD18-中] 誰最有名?</font> #### =>[題目連結](https://e-tutor.itsa.org.tw/e-Tutor/mod/programming/view.php?a=19457) #### 問題敘述: 找出被最多人認識的人。(<font color="#f00"> 變態的題目敘述都很短。</font>) ### 完成者: 1. <社長> > [time=Sat, May 30, 2020 8:12 PM] 2. <吳冠毅> > [time=Sat, Jun 6, 2020 2:38 PM] > 外掛開著開著才寫了出了 #### 社長提供的測資: ``` input: Y Y N N Y Y N Y N N Y Y Y Y N Y N N N N N Y Y N N N Y Y N Y N N Y Y Y Y Y Y Y Y N N N N N N N N ``` ``` output: 5 ``` ### 參考解答(社長提供): #### C++: ```cpp= #include <iostream> #include <iomanip> #include <sstream> #include <algorithm> #include <string.h> #define MAX 20 using namespace std; char know[MAX][MAX]; int main(){ int max_i=0; int temp_j=0; stringstream ss(""); string input; while(!cin.eof()){ getline(cin,input); ss.str(""); ss.clear(); ss << input; temp_j=0; while(ss>>know[max_i][temp_j++]){ //cout << know[max_i][temp_j-1] << " "; } //cout << endl; max_i++; } int max_j=strlen(know[0]); //cout << max_j << endl; int table[max_j]; memset(table,0,sizeof(table)); for(int i=0;i<max_i;i++){ for(int j=0;j<max_j;j++){ if(know[i][j]=='Y') table[j]++; } } sort(table,table+max_j); if(table[max_j-1]==table[max_j-2]) cout << "NO!" << endl; else cout << table[max_j-1] << endl; return 0; } ``` ### 參考解答(社員提供): --- ## <font color="#FF030B2255">統計表 | 第一題 | 第二題 | 第三題 | 第四題 | 第五題 | 全對者 | |:------:|:------:|:------:|:------:|:------:|:------:| | 10 | 9 | 7 | 4 | 2 | 2 | --- > [time=Sat, Jun 13, 2020 9:00 PM] ###### tags: `社內考試`