staircase nim ã®æµãã§
åé¡æ¦è¦
åã®ç³ã®å±±ãå·¦ããé ã«ä¸åã«ä¸¦ãã§ãã¦ãåå±±ã«ã¯
åã®ç³ãç©ã¾ãã¦ãããåæç¶æ
ã§ã¯
ãæºããã¦ãããä»å æã¨å¾æã交äºã«
- ç³ã 1 å以ä¸ãã好ããªå±±ã 1 ã¤é¸ãã§
- ä½åãã®ç³ãåãå»ã
- ãã ã
ã¨ããç¶æ ãç¶æããªããã°ãªããªãããã®æ¡ä»¶ãæºããéãã¯ä»»æåæ°ã®ç³ãåãå»ããã¨ãã§ãã
ã¨ããæ¡ä»¶ã§ãã¬ã¤ãããå ã«æä½ãè¡ããªããªã£ãæ¹ãè² ãã§ãããåæ¹æåãå°½ãããã¨ããã©ã¡ããåã¤ãï¼
ã¾ãå æå¿ åã®å ´åã¯ãæåã«ã¨ãã¹ãç³ã®åæ°ã¨ãã¦èããããæå°å¤ãæ±ããã
å¶ç´
èãããã¨
å®ã¯
ã¨åãåé¡ã«ãªã£ã¦ãããå ·ä½çã«ã¯ãä¾ãã°
{3, 9, 10} -> {3, 7, 10}
ã®ããã«ç³ãæ¸ããæä½ã¯ãé£ãåãç³ã®åæ°ã®å·®ã§ã¿ãã¨
{3, 6, 1} -> {3, 4, 3}
ã¨ããããã«ããå·¦é£ã®å±±ããç³ãä½åãé¸ãã§å³é£ã®å±±ã«ç³ã移ãæä½ãã¨æããã¨ãã§ãããããã¦ãå調éæ¸å°ãã¨ããæ¡ä»¶ã¯ãç³ã®åæ°ã®å·®ã®ä¸çã§ã¯ãã©ã®å±±ã®ç³ã®åæ°ããã¤ãã¹ã«ã¯ãªããªãããã«ãã¨ããã®ã«ããã¿ãªå¯¾å¿ããã
ãã£ã¦é£ãåãç³ã®åæ°ã§è¦ãä¸çã«ããã¦ãå¿ åæ³ã¯
^
^
= 0
ã¨ãªããã¨ã§ãããå®éã«åãã¹ãç³ã®åæ°ãæ¯è¼ç容æã«å¾©å ã§ããã
#include <iostream> #include <vector> #include <string> #include <sstream> using namespace std; class StoneGameStrategist { public: string play(vector<int> a) { vector<int> b; b.push_back(a[0]); for (int i = 0; i + 1 < a.size(); ++i) { b.push_back(a[i+1] - a[i]); } int nim = 0; for (int i = b.size() - 1; i >= 0; i -= 2) nim ^= b[i]; if (nim == 0) return "YOU LOSE"; int mi = 1<<29, mii = -1; // i ã試ãå ´åãèãã for (int i = b.size() - 1; i >= 0; i -= 2) { int need = nim ^ b[i]; // i ãã i+1 ã¸ç§»ãããã㯠a ã§ã¯ i ããåããã¨ã«ç¸å½ if (need < b[i]) { if (mi >= b[i] - need) mi = b[i] - need, mii = i; } // i-1 ãã i ã¸ç§»ãããã㯠a ã§ã¯ i-1 ããåããã¨ã«ç¸å½ else { // å·¦ããã¤ãã¹ã«ãªã£ã¦ã¯ãã¡ if (i == 0 || need - b[i] > b[i-1]) continue; if (mi >= need - b[i]) mi = need - b[i], mii = i-1; } } stringstream ss; ss << "TAKE " << mi << " STONES FROM PILE " << mii; return ss.str(); } };