質問の意味:
XI * Yiが長方形のチョコレート、アリスのみ垂直分割チョコレート、ボブだけ水平分割チョコレートを有しています。具体的には、アリスのために、チョコレートX iは、Y iは、*のY i及びb *表Yに分解することができる* I請求+ B = X iと、B> 0。ボブのために、チョコレートX iはB> 0、iは、Xに分解することができる私は*ここで、X iはBとA + B = Y Iおよび* Yを*。(各カットが整数単位で切断することができる、例えば、チョコレート3の幅は、2つの1.5 1に切断鉛直カットをカットしません)
最後に、誰が操作することはできません、と誰でも失われました
ソリューション:
人が操作に関連される前に、他の、およびステップ数;私達はちょうどそれらの2が移動し、それを比較することができ与えられたチョコレートの最大ステップ数を見つける必要がある質問の意味よると
4×4のようなチョコレートのような、アリスはそれぞれ1〜カット(第13、第二112、第三1111)、そうボブ各切断幅であれば1チョコレート、彼は3 * 4 = 12段階の合計を行くことができます。しかし、カットの半分の合計幅に応じて毎回アリス場合は、アリスまたは4つのステップ(最初の22にカットし、その後、すべての2カットを見つけるために)を取るが、ボブはわずか2つのステップを歩くことができます
アリスボブのステップの数が多いほど難しくは勝つためにあるため、アリスとボブは確かに切断する半分の合計幅に応じて毎回アリスは最高で、ステップの最小数を取りたいです
コード:
1 // 参考:https://blog.csdn.net/qq_34374664/article/details/52959986 2の#include <iostreamの> 3 4の#include <cstdioを> 5 6の#include <CStringの> 7 8の#include <アルゴリズム> 9 10 使って 名前空間はstdを、 11 12 のconst int型 MAXN = 1E9 + 7 。 13 14 のint main()の 15 16 { 17 18 INT X、Y、N、T、ケース= 0 。 19 20 のscanf("%のD "& T); 21 22 ながら(t-- ) 23 24 { 25 26 長い 長い ansx = 0、ansy = 0 ; 27 28 のscanf(" %d個"、&n)は、 29 30 のために(int型私は= 1 ; iが<= N; iは++ ) 31 32 { 33 34 のscanf(" %d個の%のD "、およびX&Y); 35 36 一方、(X> 1つの && Y> 1 ) 37 38 { 39 40 X / = 2 。 41 42 Y / = 2 。 43 44 ansx ++ 。 45 46 ansy ++ ; 47 48 } 49 50 であれば(x == 1)ansy + = Y - 1 。 51 52 であれば(Yの== 1)ansx + = X - 1 。 53 54 } 55 56 であれば(ansx <= ansy)のprintf(" ケース%のD:ボブの\ n "、++ ケース)。 57 58 他の printf関数(" ケースは%d:アリス\ nを"、++ ケース)。 59 60 61 62 } 63 64 65 66 67 68 戻り 0 ; 69 70 }
POJ質問の2960 S-ニムの意味:
失われた誰でも最後の石を取ることができない; N、あなたがだけ入力されます。このサンプルの最初の行の各特定の数の一定数を取ることができ、それぞれの石の石のヒープを与えます
ソリューション:
もちろんSG機能は、最初のサンプルについて話をします
225 //最初の数をkと、入力されたKの背後にある番号は、あなたが取ることができ、各数はあたりの石の数を制限することである
3を//下の行数を尋ねた
2512 //最初の数は数あります石スタックは、各スタックは、バック石の数である
。3 2 4 7
。4. 3. 7 2 12であり
我々は、彼らがお互いXORを聞かせた後、ゲームニームの前に石の山に対処することができますように石の512の2山のために
SG(0)= 0 //初期化
SG(1)= 0
SG(2)= {SGのMEX(0)} = 1
SG(3)= MEX {SG(1)} = 1
SG(4)= {SGのMEX(2)} = 0
SG(5)= {SGのMEX(0)、SG(3)} = 2
SG(6)= MEX {SG(1)、SG(4)} = 1
SG(7)= {SGのMEX(2)SG(5)} = 0
SG(8)= {SGのMEX(6)、SG(3)} = 0
SG(9)= {SGのMEX(7)、SG(4)} = 1
SG(10)= MEX {SG(8)、SG(5)} = 1
SG(11)= MEX {SG(9)、SG(6)} = 0
SG(12)= {SGのMEX(10)、SG(7)} = 2
失うこの時したがって、石の2つのスタックの結果は、SG(5)^ SG(12)= 0であります
そして、それは確かにサンプルプレファンクションテーブルSGの各セットの最初のヒットであります
コード:
1の#include <iostreamの> 2の#include <cstdioを> 3の#include <cmath> 4の#include <CStringの> 5の#include <アルゴリズム> 6 使って 名前空間STD。 7 の#pragmaコメント(リンカ、 "/ STACK:102400000,102400000") 8つ の#define LS I << 1つの 9 の#defineのRS LS | 1 10 の#define半ば((LL + RR)>> 1) 11 の#define PII対<整数、整数> 12 の#define MPはmake_pair 13のtypedef 長い 長LLと、 長い INF = 1E18 + 1LL。 15 CONST ダブルパイ= ACOS( - 1.0 )。 16 のconst int型 N = 5E5 + 10、M = 2E5 + 20、MOD = 1E9 + 7、INF = 2E9。 17 18 のint VIS K、SG [N]、S [N]、[N]。 19 チャーA [N]。 20 INT メイン(){ 21 ながら(scanf関数(" %dの"!&K)= EOF){ 22 であれば(k個の== 0)ブレーク。 23 のために(INT I = 1は、()I ++はscanfのを、私は= Kを< " %のD "、&S [I]); 24 SG [ 0 ] = 0 ; 25 用(INT I = 1 ; Iは<= 10000 ; + I)は、{+ // 演奏テーブル検索するための前処理のSG値が 26である ため(INT J = 0 J <=; 100 ; VIS J ++)[J] = 0 ; 27 用(INT J = 1。 ; J <= K; ++ J){ 28 IF(I> = S [J] && SG [I - S [J] <=100)VIS [SG [I - S [J]]] = 1 ; // このステップは、この点から判断することであることができる 29 } 30 のために(INT J = 0 ; J <= 100 ; J ++){ // このステップは、最小値MEX見つからないように対応する 31である IF(!{VIS [J]) 32 SGの【をI] = J; 33である BREAK ; 34である } 35 } 36 } 37 [ int型 Q、CNT = 0 ; 38である scanfの(" %dの"&Q); 39 ながら(Q - ){ 40 のint X、Y、ANS = 0 ; 41は、 scanfの(" %のD "およびX) 42は 、一方(x-- ){ 43は scanfの(" %D "& Y)、 44は ANSのSG ^ = [Y]; // それがXOR再び石の各山の値をSG得た後 45 } 46で IF(ANS)のprintf(" Wが" ); 47 他のprintf (" L " ); 48 } 49 のprintf(" の\ n " ); 50 } 51 リターン 0 。 52 }