Giải pháp cho Các Bài Toán A đến D trong Vòng 962 Codeforces (Div. 3)

Bài toán A: Chân Động Vật

Nội dung bài toán: Với một số chẵn, xác định số lượng đầu tối thiểu của động vật trên trang trại (chỉ có bò và gà). Giải pháp: Xác định số lượng bò tối đa trước, sau đó là số lượng gà tối đa.

#include<iostream>
using namespace std;

int main() {
    int t;
    cin >> t;
    while(t--) {
        long long n;
        cin >> n;
        if(n % 4 == 0) {
            cout << n / 4 << endl;
        } else {
            int k = n / 4;
            n -= k * 4;
            k += n / 2;
            cout << k << endl;
        }
    }
    return 0;
}

Bài toán B: Thu Nhỏ Ma Trận

Nội dung bài toán: Cho ma trận kích thước n×n, thu nhỏ nó theo hệ số k. Giải pháp: In ra phần tử tại vị trí [i+k][j+k].

#include<iostream>
#include<vector>
using namespace std;

const int MAX = 1005;

int main() {
    int t;
    cin >> t;
    while(t--) {
        int n, k;
        cin >> n >> k;
        vector<string> grid(n);
        for(int i = 0; i < n; ++i) {
            cin >> grid[i];
        }
        for(int i = 0; i < n; i += k) {
            for(int j = 0; j < n; j += k) {
                cout << grid[i][j];
            }
            cout << endl;
        }
    }
    return 0;
}

Bài toán C: Sắp Xếp Chuỗi

Nội dung bài toán: Cho hai chuỗi, tính số ký tự cần thay đổi để hai chuỗi giống nhau sau khi sắp xếp từ chỉ số l đến r. Giải pháp: Tính tổng số lượng ký tự ở mỗi vị trí và so sánh.

#include<iostream>
#include<vector>
using namespace std;

const int MAX = 1005;

int main() {
    int t;
    cin >> t;
    while(t--) {
        int n, m;
        cin >> n >> m;
        string s1, s2;
        cin >> s1 >> s2;
        s1 = ' ' + s1 + ' ';
        s2 = ' ' + s2 + ' ';
        vector freq1(n+1, vector<int>(27, 0));
        vector freq2(n+1, vector<int>(27, 0));

        for(int i = 1; i <= n; ++i) {
            freq1[i][s1[i] - 'a' + 1]++;
            for(int j = 1; j <= 26; ++j) {
                freq1[i][j] += freq1[i-1][j];
            }
        }

        for(int i = 1; i <= n; ++i) {
            freq2[i][s2[i] - 'a' + 1]++;
            for(int j = 1; j <= 26; ++j) {
                freq2[i][j] += freq2[i-1][j];
            }
        }

        for(int i = 1; i <= m; ++i) {
            int a, b;
            cin >> a >> b;
            int diff = 0;
            for(int j = 1; j <= 26; ++j) {
                int cnt1 = freq1[b][j] - freq1[a-1][j];
                int cnt2 = freq2[b][j] - freq2[a-1][j];
                diff += abs(cnt1 - cnt2);
            }
            cout << diff / 2 << endl;
        }
    }
    return 0;
}

Bài toán D: Thử Thách

Nội dung bài toán: Cho ba số nguyên a, b, c với điều kiện a*b + a*c + b*c ≤ n và a+b+c ≤ x. Tìm số tổ hợp khác nhau thỏa mãn điều kiện. Giải pháp: Dùng phương pháp brute-force để kiểm tra tất cả các tổ hợp khả thi.

#include<iostream>
using namespace std;

int main() {
    int t;
    cin >> t;
    while(t--) {
        int n, x;
        cin >> n >> x;
        long long count = 0;
        for(int a = 1; a <= n; ++a) {
            for(int b = 1; a * b <= n && a + b <= x; ++b) {
                count += min((n - a * b) / (a + b), x - a - b);
            }
        }
        cout << count << endl;
    }
    return 0;
}

Thẻ: Codeforces C++ Competitive Programming Algorithms Problem Solving

Đăng vào ngày 9 tháng 7 lúc 15:08