Xチケットゲームゲーム理論

タイトル

MonocarpとBicarpはバーランドに住んでおり、すべてのバスのチケットはn桁(nは偶数)で構成されています。夕方の散歩中に、モノカープとビカープは数字の一部が消去されたチケットを見つけました。消去された桁数は偶数です。

MonocarpとBicarpは、このチケットでゲームをプレイすることを決定しました。モノカープはハッピーチケットを嫌い、バイカープはそれらを収集します。このチケットの最初のn / 2桁の合計が最後のn / 2桁の合計と等しい場合、チケットはハッピーと見なされます。

MonocarpとBicarpが交代します(そしてMonocarpが最初に実行します)。各ターンの間、現在のプレイヤーは、消去された数字を0から9の数字に置き換える必要があります。チケットに消去された数字がない場合、ゲームは終了します。

消去されたすべての数字が10進数字に置き換えられた後、チケットが満足のいくものであれば、バイカープが勝ちます。そうでなければ、Monocarpが勝つ。両方のプレイヤーが最適にプレーした場合、誰が勝つかを決定する必要があります。

入力

最初の行には、1つの偶数の整数n(2≤n≤2⋅105)(チケットの桁数)が含まれています。

2行目には、n桁の文字列と「?」が含まれています。キャラクター— MonocarpとBicarpが見つけたチケット。i番目の文字が「?」の場合、i番目の数字が消去されます。先行ゼロがある場合があることに注意してください。「?」の数 文字は偶数です。

出力

Monocarpが勝った場合は、「Monocarp」を(引用符なしで)印刷します。それ以外の場合は、 "Bicarp"(引用符なし)を印刷します。

入力1

4
0523

出力1

Bicarp

入力2

2
??

出力2

Bicarp

入力3

8
?054??0?

出力3

Bicarp

入力4

6
???00?

出力4

Monocarp

注意

最初の例ではチケットに疑問符がないので、ゲームが始まる前に勝者が決定され、それはBicarpです。

2番目の例では、バイカープも勝利します。Monocarpが消去された数字を選択して新しい数字に置き換えると、Bicapは消去された数字の別の位置を選択して同じ数字に置き換えることができるので、チケットは満足です。

解決策

件名

長さの文字列への列数N、偶数の偶数があるその「?」、M
及びBにおける「?」フィルの数に、前半の数字の後に埋めるとBを獲得した後、半分に等しく、M又は勝利
M先に進んで、誰が勝つかを尋ねます

問題解決のアイデア

\(合計\)は数値の合計\(cnt \)は "?"の数です
。B.勝利条件:\(sum_ {left} -sum_ {right} =(cnt_ {right} -cnt_ {left})* 9 / 2 \)
これは次のように考えることができます:
左側と右側は2つの石の山と考えることができます\(合計\)は石の数、\(cnt \)は操作の数、一度に0〜9個の石を置くことができます

M最初に、2つの側を異ならせるために、差を確実に拡大し、大きい側に9を入力します;
B後で、2つの側を同じにするために、差を小さくし、小さい側に9を補う必要があるため、
2つのパイル操作可能な石の数を減らすことができます

2つの石の山には、それぞれ同じ数と操作可能な回数があります。次のような状況があります。

  1. 回数と操作可能回数の両方がなくなったので、B勝だろう

  2. 残りの石と操作の数が片側にある場合、MとBがどのように配置されても、2つの石の山を等しくすることはできず、Mが勝ちます。

  3. 石がありますが、操作可能な一方で、我々は慎重にこのような状況を分析する必要が
    1手を石Sは、他の側には、時間を操作することができ
    起因する\(A_1 + A_2 \)であっても、そう\(| A_1、A_2 | \ )も偶数です
    。2つの合計が9の場合にのみ、どちらが0〜9であっても、0〜9の数を見つけることができるため、2つの数字の合計は9に
    なるため、\ (s /(a / 2)= 9 \)、Bが勝つことができます
    。2つの操作をグループとして考えます。ここで、\(a / 2 \)は複数の操作グループを持つことができます

要約すると、判断式を描くことができます

\(sum_ {left}-sum_ {right} =(cnt_ {right}-cnt_ {left})* 9/2 \)

コード

#include <cstdio>
using namespace std;
int n, s1, s2, a1, a2, a, s;
char c;
int main() {
    scanf("%d", &n);
    for(int i = 1; i <= n / 2; i++) 
        scanf(" %c", &c), c == '?' ? a1++ : s1 += c - '0';
    for(int i = n / 2 + 1; i <= n; i++) 
        scanf(" %c", &c), c == '?' ? a2++ : s2 += c - '0';
    a = a1 - a2; s = s2 - s1;
    puts(s == a * 9 / 2 ? "Bicarp" : "Monocarp");
    return 0;
}

おすすめ

転載: www.cnblogs.com/Z8875/p/12760034.html