Xin chào, bạn được Lemonring mời tham gia diễn đàn viết bài kiếm tiền VNO, bấm vào đây để đăng ký.
1 người đang xem
Bài viết: 28 Tìm chủ đề
3514 5
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;
}
 

Những người đang xem chủ đề này

Back