此題在高中生程式解題系統的題號為:
https://zerojudge.tw/ShowProblem?problemid=c295。
解法一,排序為主:
- 用二維整數陣列(也就是矩陣) d[20][20] 來存放資料。
- 針對矩陣的每一列(也就是每一群數字)作由小到大排序,而第 i 群數字的最大值會在 d[i][m-1] 位置上。
- 將每一群的最大數字做加總,儲存在整數變數 sum。
- 判斷每一群的所挑選出來的數字是否整除 sum。
- 使用 flag 來判斷這 n 群是否有一群以上的數字可整除 sum。
C++ 程式碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
| #include <iostream>
#include <algorithm>
using namespace std;
int main(void) {
int d[20][20] = {0}; // 用二維整數陣列(也就是矩陣) d[20][20] 來存放資料。
int n, m;
while(cin >> n >> m) // 讀取 n, m
{
// 讀取每一群的數字
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
cin >> d[i][j];
// 針對矩陣的每一列(也就是每一群數字)作由小到大排序
for(int i = 0; i < n; i++)
sort(d[i], d[i] + m);
// 將每一群的最大數字做加總,儲存在整數變數 sum。
int sum = 0;
for(int i = 0; i < n; i++)
sum = sum + d[i][m-1]; // 第 i 群數字的最大值會在 d[i][m-1] 位置上。
cout << sum << endl;
int flag = 0; // 判斷這 n 群是否有一群以上的數字可整除 sum。
// 判斷每一群的所挑選出來的數字是否整除 sum。
for(int i = 0; i < n; i++)
{
int v = d[i][m-1];
if(sum % v == 0) // 第 i 群所挑出來的數字是否有整除sum。
{
if(flag == 0) // 可整除的第一個數字不用空白
cout << v;
else
cout << " " << v; // 可整除的第二個數字,前面需要加上空白
flag = 1;
}
}
// 判斷這 n 群是否有一群以上的數字可整除 sum。
if(flag == 0)
cout << -1 << endl;
}
return 0;
}
|
C 程式碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
| #include <stdio.h>
#include <stdlib.h>
int cmp(const void *a, const void *b)
{
return ( *(int*)a - *(int*)b );
}
int main(void) {
int d[20][20] = {0}; // 用二維整數陣列(也就是矩陣) d[20][20] 來存放資料。
int n, m;
while(scanf("%d%d", &n, &m) == 2) // 讀取 n, m
{
// 讀取每一群的數字
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
scanf("%d", &d[i][j]);
// 針對矩陣的每一列(也就是每一群數字)作由小到大排序
for(int i = 0; i < n; i++)
qsort(d[i], m, sizeof(int), cmp);
// 將每一群的最大數字做加總,儲存在整數變數 sum。
int sum = 0;
for(int i = 0; i < n; i++)
sum = sum + d[i][m-1]; // 第 i 群數字的最大值會在 d[i][m-1] 位置上。
printf("%d\n", sum);
int flag = 0; // 判斷這 n 群是否有一群以上的數字可整除 sum。
// 判斷每一群的所挑選出來的數字是否整除 sum。
for(int i = 0; i < n; i++)
{
int v = d[i][m-1];
if(sum % v == 0) // 第 i 群所挑出來的數字是否有整除sum。
{
if(flag == 0) // 可整除的第一個數字不用空白
printf("%d", v);
else
printf(" %d", v); // 可整除的第二個數字,前面需要加上空白
flag = 1;
}
}
// 判斷這 n 群是否有一群以上的數字可整除 sum。
if(flag == 0)
printf("-1\n");
}
return 0;
}
|
Python 程式碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
| while True:
try:
n, m = map(int, input().split())
m = []
for i in range(n):
v = list(map(int, input().split()))
v.sort(reverse = True) # 由大到小做排序
m.append(v)
# 算總和
sum = 0
for v in m:
sum = sum + v[0]
print(sum)
flag = 0
for v in m:
i = v[0]
if sum % i == 0: # 此群最大值是否可以整除總和
if flag == 0:
print(i, end='')
else:
print('', i, end='')
flag = 1
if flag == 0:
print(-1)
except EOFError:
break
|
解法二,不排序:
- 用一個整數陣列 v[20] 來存放每群數字的最大值。
- 每一群資料在讀取時,邊判斷目前讀取到的數字是不是最大值。
- 讀完一群數字後,將此群的最大值存放到 v[i] 中,並加總到 sum 。
- 判斷每一群的所挑選出來的數字是否整除 sum。
- 使用 flag 來判斷這 n 群是否有一群以上的數字可整除 sum。
C++ 程式碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
| #include <iostream>
using namespace std;
int main(void) {
int v[20]; // 用一維陣列來儲存每一群的最大值
int n, m;
while(cin >> n >> m) // 讀取 n, m
{
int sum = 0;
// 讀取每一群的數字
for(int i = 0; i < n; i++)
{
int x = 0; // 此群的最大值
for(int j = 0; j < m; j++)
{
int t;
cin >> t;
if(x < t) x = t;
}
v[i] = x; // 儲存此群的最大值
sum += x; // 將每一群的最大數字做加總。
}
cout << sum << endl;
int flag = 0; // 判斷這 n 群是否有一群以上的數字可整除 sum。
// 判斷每一群的所挑選出來的數字是否整除 sum。
for(int i = 0; i < n; i++)
{
int x = v[i];
if(sum % x == 0) // 第 i 群所挑出來的數字是否有整除sum。
{
if(flag == 0) // 可整除的第一個數字不用空白
cout << x;
else
cout << " " << x; // 可整除的第二個數字,前面需要加上空白
flag = 1;
}
}
// 判斷這 n 群是否有一群以上的數字可整除 sum。
if(flag == 0)
cout << -1 << endl;
}
return 0;
}
|
C 程式碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
| #include <stdio.h>
#include <stdlib.h>
int main(void) {
int v[20];
int n, m;
while(scanf("%d%d", &n, &m) == 2) // 讀取 n, m
{
int sum = 0;
// 讀取每一群的數字
for(int i = 0; i < n; i++)
{
int x = 0; // 此群的最大值
for(int j = 0; j < m; j++)
{
int t;
scanf("%d", &t);
if(x < t) x = t;
}
v[i] = x; // 儲存此群的最大值
sum += x; // 將每一群的最大數字做加總。
}
printf("%d\n", sum);
int flag = 0; // 判斷這 n 群是否有一群以上的數字可整除 sum。
// 判斷每一群的所挑選出來的數字是否整除 sum。
for(int i = 0; i < n; i++)
{
int x = v[i];
if(sum % x == 0) // 第 i 群所挑出來的數字是否有整除sum。
{
if(flag == 0) // 可整除的第一個數字不用空白
printf("%d", x);
else
printf(" %d", x); // 可整除的第二個數字,前面需要加上空白
flag = 1;
}
}
// 判斷這 n 群是否有一群以上的數字可整除 sum。
if(flag == 0)
printf("-1\n");
}
return 0;
}
|
Python 程式碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| while True:
try:
n, m = map(int, input().split())
sum = 0
m = []
for i in range(n):
v = max(list(map(int, input().split()))) # 找這一群數字的最大值
sum = sum + v # 每一群的最大值做加總
m.append(v) # 將每一群的最大值存到 m
print(sum)
flag = 0
for i in m:
if sum % i == 0: # 此群最大值是否可以整除總和
if flag == 0:
print(i, end='')
else:
print('', i, end='')
flag = 1
if flag == 0:
print(-1)
except EOFError:
break
|
若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。
If you like this post, please click the ads on the blog or buy me a coffee. Thank you very much.