Hướng dẫn giải của Mã định danh (Đề HSG KonTum 2021)


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.

Hướng dẫn giải

Mỗi dòng input là một dãy 7 chữ số. Chữ cái được xác định bằng cách nhân từng chữ số với trọng số 3, 5, 7, 9, 2, 4, 2, cộng các tích lại rồi lấy số dư khi chia cho 9. Số dư 0..8 ứng với chữ A B C D E F G H K. Cần in chữ cái cho từng dòng của file.

Sub 1: Vét cạn — ~O(L \cdot 7 \cdot w)~

Với mỗi dòng, cộng lần lượt từng tích d · w bằng cách cộng d đúng w lần, sau đó tìm số dư bằng cách trừ liên tiếp 9. Đúng theo đề nhưng dùng nhiều vòng lặp không cần thiết (L là số dòng).

Kết quả chấm: đạt 25/25 test.

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

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    if (fopen("MADD.INP", "r")) { freopen("MADD.INP", "r", stdin); freopen("MADD.OUT", "w", stdout); }

    const int w[7] = {3, 5, 7, 9, 2, 4, 2};     // trong so cua 7 chu so
    const string letters = "ABCDEFGHK";        // so du 0..8 tuong ung chu cai
    string s;
    while (cin >> s) {
        // Tinh tong cac tich, cong tung tich mot (vet can)
        long long total = 0;
        for (int i = 0; i < 7; i++) {
            int d = s[i] - '0';
            for (int t = 0; t < w[i]; t++) total += d;   // d * w[i] cong lap lai
        }
        // Lay so du bang cach tru lien tiep 9
        while (total >= 9) total -= 9;
        cout << letters[total] << "\n";
    }
    return 0;
}
Sub 2: Tính trực tiếp bằng phép chia lấy dư — ~O(L)~

Tính tổng Σ d_i · w_i trực tiếp bằng phép nhân, rồi lấy total % 9 làm chỉ số tra bảng chữ cái. Đọc từng dòng bằng cin >> s đến khi hết file.

Kết quả chấm: đạt 25/25 test.

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

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    if (fopen("MADD.INP", "r")) { freopen("MADD.INP", "r", stdin); freopen("MADD.OUT", "w", stdout); }

    const int w[7] = {3, 5, 7, 9, 2, 4, 2};     // trong so cua tung chu so
    const string letters = "ABCDEFGHK";        // so du 0..8 -> chu cai
    string s;
    while (cin >> s) {
        long long total = 0;
        for (int i = 0; i < 7; i++) total += (s[i] - '0') * w[i];
        // So du khi chia cho 9 quyet dinh chu cai
        cout << letters[total % 9] << "\n";
    }
    return 0;
}

Bình luận

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.