Hướng dẫn giải của TỔNG TRÊN TỪNG DÒNG (TTD.CPP)


Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.

1. Đề bài tóm tắt

Cho một bảng số gồm ~m~ hàng và ~n~ cột (~1 \le m, n \le 1000~). Yêu cầu tính và in ra tổng các số nằm trên mỗi hàng của bảng đó.

  • Đầu vào (INPUT):
    • Dòng 1: Hai số nguyên dương ~m~ và ~n~.
    • ~m~ dòng tiếp theo: Mỗi dòng gồm ~n~ số nguyên.
  • Đầu ra (OUTPUT):
    • In ra ~m~ dòng, dòng thứ ~i~ chứa tổng các số của hàng thứ ~i~.

2. Phân tích bài toán

  • Bài toán yêu cầu tính tổng độc lập cho từng dòng trong bảng.
  • Với mỗi dòng từ ~1~ đến ~m~:
    • Khởi tạo biến lưu tổng sum = 0.
    • Đọc lần lượt ~n~ phần tử của dòng đó và cộng dồn trực tiếp vào sum.
    • Sau khi đọc xong ~n~ phần tử của dòng, in ra giá trị sum.
  • Lưu ý về kiểu dữ liệu:
    • Do các phần tử có thể mang giá trị âm hoặc lớn, ta nên dùng kiểu dữ liệu long long cho biến tổng sum để tránh bị tràn số khi cộng dồn.
    • Do ~m, n \le 1000~, số lượng phần tử cần xử lý lên đến ~10^6~ số. Việc nhập xuất dữ liệu nhanh sẽ giúp chương trình chạy mượt mà hơn.

3. Độ phức tạp

  • Thời gian (Time Complexity): ~O(m \times n)~ — Duyệt qua tất cả các phần tử trong bảng đúng một lần.
  • Không gian (Space Complexity): ~O(1)~ — Ta xử lý tính tổng trực tiếp khi đọc từng số mà không cần lưu lại toàn bộ bảng vào mảng 2 chiều.

4. Mã nguồn C++ minh họa

#include <bits/stdc++.h>
using namespace std;

const int NM = 1000;

//Khai báo biến mảng 2 chiều a tối đa NM dòng và NM cột
int a[NM+5][NM+5];

int main() {
    // Tối ưu hóa tốc độ nhập/xuất dữ liệu trong C++
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    int m, n;
    cin >> m >> n;

    //Nhập mảng hai chiều
    for(int i=1; i<=m; i++)
        for(int j=1; j<=n; j++)
            cin >> a[i][j];

    // Lặp qua từng dòng trong m dòng
    for (int i = 1; i <= m; i++) {
        long long sum = 0; // Khởi tạo biến tổng cho dòng hiện tại (dùng long long để tránh tràn số)

        // Đọc n phần tử của dòng hiện tại và cộng dồn trực tiếp
        for (int j = 1; j <= n; j++) {
            sum += a[i][j]; // Cộng dồn giá trị vừa nhập vào biến sum
        }

        // In kết quả tổng của dòng hiện tại, chuyển sang dòng mới cho dòng tiếp theo
        cout << sum << "\n";
    }

    return 0;
}

5. Ví dụ mô phỏng

Input:
4 6
1 6 2 4 -7 10
6 3 -9 7 2 3
-6 5 0 1 1 -4
0 2 77 1 99 3
Quá trình tính toán:
  • Dòng 1: ~1 + 6 + 2 + 4 + (-7) + 10 = 16~ ~\rightarrow~ In ra 16
  • Dòng 2: ~6 + 3 + (-9) + 7 + 2 + 3 = 12~ ~\rightarrow~ In ra 12
  • Dòng 3: ~(-6) + 5 + 0 + 1 + 1 + (-4) = -3~ ~\rightarrow~ In ra -3
  • Dòng 4: ~0 + 2 + 77 + 1 + 99 + 3 = 182~ ~\rightarrow~ In ra 182
Output:
16
12
-3
182

Đang tải...