---
# System prepended metadata

title: 黎明高中資訊社第三次平時考
tags: [社內考試]

---

# 黎明高中資訊社第三次平時考
---
## 目錄:
> [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: `社內考試`



