[BZOJ3895]は(法律を見つけるために、+良い思考タイトルゲーム理論)石を取ります

タイトル説明

アリスとボブは2人の良い友人が石を取るために友人と遊ぶようになったです。ゲーム開始が、積み重ねN石がある場合
行には、それらは、必要に応じて各操作の規則に従って、動作(アリス優勢)をオン:
・ヒープからの石の除去
石の任意の二つの山-merge
操作は失うことができません。彼女が勝つ戦略を持っていることができればアリスは疑問に思いました。

入力
最初の行は、データセットの数を示すために、Tを入力します。
各試験のために、最初の行は、リードNです。
次に、Nは正の整数A1、A2は...、石の各杭の数を表します。
出力
各テストケース、出力線について。
出力YESは、アリスが必勝法、無戦略を受賞アリス出力NO手段を有することを意味します。
サンプル入力
。3
。3
。1 1 2
2
3 4
3
2 3 5
サンプル出力
YES
NO
NO
データ空間の制約範囲
T <= 100、N <= 50、愛<= 1000;
制限時間:1秒メモリ制限:128 MBの
アイデア:
事前に列挙のいくつかの例、法律の導入は

、もともとのアイデアを書きたいのですが、メモリの問題に多くのオンラインソリューションを検索で使用されていることがわかったが、これは非常に良いではありませんが、大きなデータの書き込みを処理することはできませんしませんでした、私はトレーニングで考えます点の単純なルールは、次のように導入:
処理N = 1、N = 2、 N = 3、シミュレーションは、手動で結果を計算することができ、そして状況がケース中、n> = 4の下方にアドレス指定されます。
2 [I]である場合、全て1、nが確かに失うか勝つ3の倍数である場合。
証明:
n = 1またはn = 2が直接借りると考えることができ、N = '遊びは石の唯一の山だったと小石の数が2であるので、相手が一回の操作で3で行うことができるか、自分の業務に関係なく、このような状況であることを見つけるでしょう4、N =、他側は石の各ロットを石の顔を取るとn = 3することができますが、例数、勝利のn = 4であり、n = 5を削除した場合、最初に見つけるとき、状態を失います石は、その後B、その後石、誰もが石を取るしようとしないためにので、その後、その後、石のヒープに積ま5石が4回をマージし、石の数が5で、失う、その後、削除します上側のハンドは、それはまた、その勝利を発見し、N =時間である。6、取得石の山を、それが石の数を除去するために休止状態5砂利パイル、マージに石の山、Bに勝つ1石は、5に登場すると、その後のアナロジーを引き出すことができ、=ので、6 Nに負け、負けの状態で積み上げた石が発生します。
3 [I]は、すべて1でない場合に
1の任意ことなく、第1のケースを検討し、スタック番号モジュロ値のモジュロ2が、その後、勝利、または失われた場合、石== 2の合計数を見つけます。
ことを証明した
石の奇数上部ハンドに勝つことN = 1は、直接、フリップWINSを観察することができ、あるいは、
合計が石の偶数である場合、上側のハンドを直接パイルを組み合わせることができるn = 2の場合、正方形の石は、勝つか、または何があっ側上部の手操作は、石の山の数の出現と砂利和のフィールド上の一操作のフリップサイドを変更することはできません。この時間は例偶数であるので、それは、失敗する運命にあります。
場合N = 3は、同じ理由であり、この時点で奇数であるため、上部左側は、2つの石失う状態の山n = 2の発生を組み合わせることにより、フィールドを作ることができ、また、上部左側が偶数に関係なく操作を防止することができる方法ではありません片側をめくるには、状態を失うの顔になります。
N> = 4は、誘導証明することができます。
すべて1でない場合、[i]は、集合sは数1で、見つけることができ
、Sが偶数である場合、上部右側のいずれかの動作のための上側の手の操作側に影響を達成するように、その後のパーティをキャンセルすることができます。
たとえば、ちょうどそのフリップ側でも取った、1辺逃げる1
また、2つの上部右側のビニング、石は非統合の数を変更していないので、非変更は石の数をスタックでもないことを、単に非2数に加算して得られたフリップサイドを置くマージパリティ。
または、上側の手側1と非マージフリップ側の石の山は、別の1は、石の数の和の非パリティを復元するために石のすぐ組み合わせヒープを適用置きます。
そこで、以下またはプライベートIのqq1807458974コメントに問題がある場合は、ここでの推論は基本的に、完成されたのは、その後、他のコードの場合、最後の1までに、2つ以上でみましょう。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
    ll n,x,s=0,sum=0,t;
    cin>>t;
    while(t--){
        cin>>n;
        s=0;sum=0;
        for(int i=1;i<=n;i++)
        {
            cin>>x;
            if(x==1)
                s++;
            sum+=x;
        }
        if(s==n)
        {
            if(sum%3!=0)
                cout<<"YES"<<endl;
            else
                cout<<"NO"<<endl;
            continue;
        }
        if(n==1)
        {
            if(sum%2==0)
                cout<<"NO"<<endl;
            else
                cout<<"YES"<<endl;
            continue;
        }
        if(n==2)
        {
            if(s==0&&sum%2==1)
                cout<<"NO"<<endl;
            else
                cout<<"YES"<<endl;
            continue;
        }
        if(n==3)
        {
            if(s==1)
                cout<<"YES"<<endl;
            if(s==2)
            {
                if(sum%2==0&&sum!=4)
                    cout<<"NO"<<endl;
                else
                    cout<<"YES"<<endl;
            }
            if(s==0)
            {
                if(sum%2==n%2)
                    cout<<"YES"<<endl;
                else
                    cout<<"NO"<<endl;
            }
            continue;
        }
        if(s%2==1)
        {
            sum-=s;
            n-=s;
            if(sum==2)
                cout<<"NO"<<endl;
            else
                cout<<"YES"<<endl;
            continue;
        }
        else
        {
            sum-=s;
            n-=s;
            //cout<<sum<<endl;
            if(sum==2||sum%2==n%2)
                cout<<"YES"<<endl;
            else
                cout<<"NO"<<endl;
        }
    }
    return 0;
}

公開された18元の記事 ウォンの賞賛6 ビュー952

おすすめ

転載: blog.csdn.net/qq_43559193/article/details/105319831