給定一個矩陣,包含 n 列,每列有 m 個數字。
步驟一:從每一列中找出該列的最大值。
步驟二:將這 n 個最大值全部相加,輸出總和 S。
步驟三:在這些最大值中,檢查哪些數字可以整除總和 S。
步驟四:依序輸出符合條件的數字。若沒有任何數字符合,則輸出 -1。
輸出格式限制: 數字之間必須用空白隔開,且最後一個數字的後方不能有空白。
這題的核心重點在於「二維資料處理」與「輸出的格式控制」:
資料讀取與比較: 我們使用兩層迴圈。外層迴圈跑 n 次(代表每一列),內層迴圈跑 m 次(代表每一列中的每個數字)。在內層迴圈中,我們用一個變數 mx 來紀錄並更新該列的最大值。
儲存與加總: 找到每一列的最大值後,將它存進一個 vector 陣列中,同時把這個最大值加進總和變數 S。
處理最後一格不留空白: 這是程式競賽常見的考點。我們在輸出時,不是在數字「後面」加空白,而是在數字「前面」加空白。
邏輯是:如果是第一個輸出的數字,就直接印出。
如果不是第一個(計數器 cnt > 0),就先印一個空白,再印數字。
這樣就能保證最後一個數字後面乾乾淨淨,沒有多餘空白。
#include <bits/stdc++.h>
using namespace std;
int main() {
// 優化輸入輸出效率,縮短執行時間
ios::sync_with_stdio(0);
cin.tie(0);
int n, m;
cin >> n >> m;
int S = 0;
vector<int> num(n, 0);
// 第一階段:找每一列的最大值
for(int i = 0; i < n; i++) {
int mx = 0;
for(int j = 0; j < m; j++) {
int input;
cin >> input;
if(input > mx) mx = input;
}
num[i] = mx; // 紀錄最大值
S += mx; // 累加到總和
}
// 第二階段:輸出總和 S
cout << S << endl;
// 第三階段:篩選並處理格式化輸出
int cnt = 0;
for(int i = 0; i < n; i++) {
// 檢查總和 S 是否能被該列最大值整除
if(S % num[i] == 0) {
// 如果 cnt > 0,代表這不是第一個數字,先輸出空白
if(cnt > 0) cout << " ";
cout << num[i];
cnt++;
}
}
// 第四階段:如果都沒有符合的數字,輸出 -1
if(cnt == 0) cout << "-1";
cout << endl;
return 0;
}
1. 題目描述
給定一個矩陣,包含 n 列,每列有 m 個數字。
步驟一:從每一列中找出該列的最大值。
步驟二:將這 n 個最大值全部相加,輸出總和 S。
步驟三:在這些最大值中,檢查哪些數字可以整除總和 S。
步驟四:依序輸出符合條件的數字。若沒有任何數字符合,則輸出 -1。
輸出格式限制: 數字之間必須用空白隔開,且最後一個數字的後方不能有空白。
2. 解題思路
這題的核心重點在於「二維資料處理」與「輸出的格式控制」:
資料讀取與比較: 我們使用兩層迴圈。外層迴圈跑 n 次(代表每一列),內層迴圈跑 m 次(代表每一列中的每個數字)。在內層迴圈中,我們用一個變數 mx 來紀錄並更新該列的最大值。
儲存與加總: 找到每一列的最大值後,將它存進一個 vector 陣列中,同時把這個最大值加進總和變數 S。
處理最後一格不留空白: 這是程式競賽常見的考點。我們在輸出時,不是在數字「後面」加空白,而是在數字「前面」加空白。
邏輯是:如果是第一個輸出的數字,就直接印出。
如果不是第一個(計數器 cnt > 0),就先印一個空白,再印數字。
這樣就能保證最後一個數字後面乾乾淨淨,沒有多餘空白。
3. 實作程式碼 (C++)
C++#include using namespace std; int main() { // 優化輸入輸出效率,縮短執行時間 ios::sync_with_stdio(0); cin.tie(0); int n, m; cin >> n >> m; int S = 0; vector num(n, 0); // 第一階段:找每一列的最大值 for(int i = 0; i < n; i++) { int mx = 0; for(int j = 0; j < m; j++) { int input; cin >> input; if(input > mx) mx = input; } num[i] = mx; // 紀錄最大值 S += mx; // 累加到總和 } // 第二階段:輸出總和 S cout << S << endl; // 第三階段:篩選並處理格式化輸出 int cnt = 0; for(int i = 0; i < n; i++) { // 檢查總和 S 是否能被該列最大值整除 if(S % num[i] == 0) { // 如果 cnt > 0,代表這不是第一個數字,先輸出空白 if(cnt > 0) cout << " "; cout << num[i]; cnt++; } } // 第四階段:如果都沒有符合的數字,輸出 -1 if(cnt == 0) cout << "-1"; cout << endl; return 0; }
1. 題目描述
給定一個矩陣,包含 n 列,每列有 m 個數字。
步驟一:從每一列中找出該列的最大值。
步驟二:將這 n 個最大值全部相加,輸出總和 S。
步驟三:在這些最大值中,檢查哪些數字可以整除總和 S。
步驟四:依序輸出符合條件的數字。若沒有任何數字符合,則輸出 -1。
輸出格式限制: 數字之間必須用空白隔開,且最後一個數字的後方不能有空白。
2. 解題思路
這題的核心重點在於「二維資料處理」與「輸出的格式控制」:
資料讀取與比較: 我們使用兩層迴圈。外層迴圈跑 n 次(代表每一列),內層迴圈跑 m 次(代表每一列中的每個數字)。在內層迴圈中,我們用一個變數 mx 來紀錄並更新該列的最大值。
儲存與加總: 找到每一列的最大值後,將它存進一個 vector 陣列中,同時把這個最大值加進總和變數 S。
處理最後一格不留空白: 這是程式競賽常見的考點。我們在輸出時,不是在數字「後面」加空白,而是在數字「前面」加空白。
邏輯是:如果是第一個輸出的數字,就直接印出。
如果不是第一個(計數器 cnt > 0),就先印一個空白,再印數字。
這樣就能保證最後一個數字後面乾乾淨淨,沒有多餘空白。
3. 實作程式碼 (C++)
C++#include using namespace std; int main() { // 優化輸入輸出效率,縮短執行時間 ios::sync_with_stdio(0); cin.tie(0); int n, m; cin >> n >> m; int S = 0; vector num(n, 0); // 第一階段:找每一列的最大值 for(int i = 0; i < n; i++) { int mx = 0; for(int j = 0; j < m; j++) { int input; cin >> input; if(input > mx) mx = input; } num[i] = mx; // 紀錄最大值 S += mx; // 累加到總和 } // 第二階段:輸出總和 S cout << S << endl; // 第三階段:篩選並處理格式化輸出 int cnt = 0; for(int i = 0; i < n; i++) { // 檢查總和 S 是否能被該列最大值整除 if(S % num[i] == 0) { // 如果 cnt > 0,代表這不是第一個數字,先輸出空白 if(cnt > 0) cout << " "; cout << num[i]; cnt++; } } // 第四階段:如果都沒有符合的數字,輸出 -1 if(cnt == 0) cout << "-1"; cout << endl; return 0; }