Giải bài ntucoder ALBO - Alice và Bob

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

  1. nguyen minh duc

    Bài viết:
    28
    Link bài:

    Thuật toán:

    • Trường hợp k = 1, người chiến thắng sẽ được xác định đơn giản:
      • Nếu n lẻ, Alice sẽ là người thắng. Bằng không, Bob sẽ thắng.
    • Trường hợp k > n, Alice sẽ thắng sau một lượt chơi.
    • Trường hợp n = k, Alice sẽ thắng sau một lượt chơi. Tổng quát với trường hợp (2x+1) *k Alice sẽ thắng.
    • Trường hợp n = 2k, Alice chỉ cần chọn k-1 và Bob có chọn thế nào thì Alice vẫn sẽ thắng.
    • Trường hợp n = k+1, Alice có chọn thế nào thì Bob cũng sẽ là người thắng cuộc. Tổng quát với trường hợp (2x+1) *k +1, (x là số tự nhiên). Bob sẽ là người thắng cuộc.
      • Duy chỉ cần n = k+2 trở lên, nếu Alice chọn n-k-1, Alice sẽ có cửa thắng. Tổng quát với trường hợp (2x+1) *k+y (Với y < k) Alice sẽ là người thắng cuộc.
    • Trường hợp n = 2*k+1, Alice sẽ lập tức chọn k ở lượt đầu tiên, và sau đó Bob có chọn thế nào thì Alice cũng sẽ thắng cuộc. Tổng quát với trường hợp 2x+2k+1. Alice sẽ là người thắng cuộc.
      • Tương tự như trên, với trường hợp 2x+2k+y (với y < k). Bob sẽ là người thắng cuộc.

    Code:

    Mã:
    #include <bits/stdc++.h>
    using namespace std;
    
    int n, k;
    
    int main(){
        //freopen("albo.inp", "r", stdin);
        //freopen("albo.out", "w", stdout);
        cin >> n >> k;
        if (k == 1){
            if ( n % 2 == 0) cout << "Bob will win"; else cout << "Alice will win";
        }else if (n%k == 0) cout << "Alice will win";
        else if (n <= k) cout << "Alice will win";
            else if (n%k == 1){
                if ((n-1)% (2*k) != 0) cout << "Bob will win";
                else cout << "Alice will win";
            }else if (n%k > 1){
                if ((n-(n%k))% (2*k) != 0) cout << "Alice will win";
                else cout << "Bob will win";
            }
    
        return 0;
    }
     
Trả lời qua Facebook
Đang tải...