#54620: c++暴力解哈哈哈


87kingsley (unknown)


1. 題目描述

給定一個矩陣,包含 n 列,每列有 m 個數字。

  • 步驟一:從每一列中找出該列的最大值。

  • 步驟二:將這 n 個最大值全部相加,輸出總和 S。

  • 步驟三:在這些最大值中,檢查哪些數字可以整除總和 S。

  • 步驟四:依序輸出符合條件的數字。若沒有任何數字符合,則輸出 -1。

輸出格式限制: 數字之間必須用空白隔開,且最後一個數字的後方不能有空白。

2. 解題思路

這題的核心重點在於「二維資料處理」與「輸出的格式控制」:

  1. 資料讀取與比較: 我們使用兩層迴圈。外層迴圈跑 n 次(代表每一列),內層迴圈跑 m 次(代表每一列中的每個數字)。在內層迴圈中,我們用一個變數 mx 來紀錄並更新該列的最大值。

  2. 儲存與加總: 找到每一列的最大值後,將它存進一個 vector 陣列中,同時把這個最大值加進總和變數 S。

  3. 處理最後一格不留空白: 這是程式競賽常見的考點。我們在輸出時,不是在數字「後面」加空白,而是在數字「前面」加空白。

    • 邏輯是:如果是第一個輸出的數字,就直接印出。

    • 如果不是第一個(計數器 cnt > 0),就先印一個空白,再印數字。

    • 這樣就能保證最後一個數字後面乾乾淨淨,沒有多餘空白。

3. 實作程式碼 (C++)

C++
#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;
}
#54621: Re: c++暴力解哈哈哈


87kingsley (unknown)


1. 題目描述

給定一個矩陣,包含 n 列,每列有 m 個數字。

  • 步驟一:從每一列中找出該列的最大值。

  • 步驟二:將這 n 個最大值全部相加,輸出總和 S。

  • 步驟三:在這些最大值中,檢查哪些數字可以整除總和 S。

  • 步驟四:依序輸出符合條件的數字。若沒有任何數字符合,則輸出 -1。

輸出格式限制: 數字之間必須用空白隔開,且最後一個數字的後方不能有空白。

2. 解題思路

這題的核心重點在於「二維資料處理」與「輸出的格式控制」:

  1. 資料讀取與比較: 我們使用兩層迴圈。外層迴圈跑 n 次(代表每一列),內層迴圈跑 m 次(代表每一列中的每個數字)。在內層迴圈中,我們用一個變數 mx 來紀錄並更新該列的最大值。

  2. 儲存與加總: 找到每一列的最大值後,將它存進一個 vector 陣列中,同時把這個最大值加進總和變數 S。

  3. 處理最後一格不留空白: 這是程式競賽常見的考點。我們在輸出時,不是在數字「後面」加空白,而是在數字「前面」加空白。

    • 邏輯是:如果是第一個輸出的數字,就直接印出。

    • 如果不是第一個(計數器 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;
}



#54622: Re: c++暴力解哈哈哈


87kingsley (unknown)


1. 題目描述

給定一個矩陣,包含 n 列,每列有 m 個數字。

  • 步驟一:從每一列中找出該列的最大值。

  • 步驟二:將這 n 個最大值全部相加,輸出總和 S。

  • 步驟三:在這些最大值中,檢查哪些數字可以整除總和 S。

  • 步驟四:依序輸出符合條件的數字。若沒有任何數字符合,則輸出 -1。

輸出格式限制: 數字之間必須用空白隔開,且最後一個數字的後方不能有空白。

2. 解題思路

這題的核心重點在於「二維資料處理」與「輸出的格式控制」:

  1. 資料讀取與比較: 我們使用兩層迴圈。外層迴圈跑 n 次(代表每一列),內層迴圈跑 m 次(代表每一列中的每個數字)。在內層迴圈中,我們用一個變數 mx 來紀錄並更新該列的最大值。

  2. 儲存與加總: 找到每一列的最大值後,將它存進一個 vector 陣列中,同時把這個最大值加進總和變數 S。

  3. 處理最後一格不留空白: 這是程式競賽常見的考點。我們在輸出時,不是在數字「後面」加空白,而是在數字「前面」加空白。

    • 邏輯是:如果是第一個輸出的數字,就直接印出。

    • 如果不是第一個(計數器 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;
}