Giải bài ntucoder XOSO - Xóa số (OLPCĐ 2012)

Thảo luận trong 'Khác' bắt đầu bởi nguyen minh duc, 8 Tháng bảy 2023.

  1. nguyen minh duc

    Bài viết:
    28
    Cho dãy n số nguyên không âm a1, a2, an. Người ta tiến hành chọn ra 2 chỉ số i, j sao cho i < j

    Và xóa khỏi dãy 2 số ai, aj để tổng giá trị các số còn lại trong dãy là số chẵn.

    Yêu cầu: Cho dãy số a1, a2, an. Hãy đếm số lượng cách chọn 2 chỉ số i, j thỏa mãn. Hai cách chọn khác nhau nếu tồn tại một chỉ số khác nhau.

    Dữ liệu nhập: gồm 2 dòng

    - Dòng 1: Chứa số nguyên n (2 ≤ n ≤ 106)

    - Dòng 2: Chứa n số nguyên không âm a1, a2, an (0 ≤ ai ≤ 109)

    Dữ liệu xuất:

    - Là một số nguyên cho biết số cách chọn 2 chỉ số i, j thỏa mãn.

    Thuật toán:

    • Ta sẽ đếm số lượng các số chẵn và lẻ trong dãy, đồng thời xác định tổng các phần tử trong dãy là lẻ hay chẵn.
    • Nếu tổng của dãy là một số lẻ, tức là ta phải xóa một số lẻ và 1 số chẵn để tổng trở về chẵn. ⇒ Với c số chẵn và l số lẻ, là có số lượng các cặp có thể xóa là c*l.
    • Nếu tổng của dãy là một số chẵn, ta phải xóa 2 số chẵn hoặc 2 số lẻ. Tức tổng số cách xóa sẽ bằng tổng số cách chọn ra 2 phần tử chẵn hoặc 2 phần tử lẻ từ 2 tập c và l.
    • Xét riêng từng tập c và l, ví dụ tập c có 5 phần tử, khi thêm một phần tử nữa vào tập thì ta sẽ có thêm 5 cách ghép phần tử thứ 6 đó với 5 phần tử kia. Tức tổng quát, với n phần tử, ta sẽ có 1+2+.. +n-1 cách chọn 2 phần tử bất kỳ.

    Code:

    Mã:
    #include <bits/stdc++.h>
    using namespace std;
    
    long long int a, n, anschan, ansle, chan, le, fn;
    
    int main(){
        ios_base::sync_with_stdio(0);
        cin.tie(0); cout.tie(0);
        //freopen("xoso.inp", "r", stdin);
        //freopen("xoso.out", "w", stdout);
        cin >> n;
        for (int i = 1; i <= n; i++){
            cin >> a;
            if (!(a%2)) chan++; else le++;
            fn = (fn+a)%2;
        }
        if (fn) cout << chan*le; else{
            for (int i = 1; i < chan; i++) anschan += i;
            for (int i = 1; i < le; i++) ansle += i;
            cout << anschan + ansle;
        }
        //cout << " " << fn;
    
        return 0;
    }
     
    Last edited by a moderator: 7 Tháng chín 2023
Trả lời qua Facebook
Đang tải...