1. 程式人生 > 實用技巧 >[題目][藍橋杯PREV-14] 高僧鬥法

[題目][藍橋杯PREV-14] 高僧鬥法

一、題目

0、題目連結

http://lx.lanqiao.cn/problem.page?gpid=T37(需要登入且需要 VIP 賬戶)

1、問題描述

古時喪葬活動中經常請高僧做法事。儀式結束後,有時會有“高僧鬥法”的趣味節目,以舒緩壓抑的氣氛。

節目大略步驟為:先用糧食(一般是稻米)在地上“畫”出若干級臺階(表示 N 級浮屠)。又有若干小和尚隨機地“站”在某個臺階上。最高一級臺階必須站人,其它任意。(如圖1所示)

兩位參加遊戲的法師分別指揮某個小和尚向上走任意多級的臺階,但會被站在高階臺階上的小和尚阻擋,不能越過。兩個小和尚也不能站在同一臺階,也不能向低階臺階移動。

兩法師輪流發出指令,最後所有小和尚必然會都擠在高段臺階,再也不能向上移動。輪到哪個法師指揮時無法繼續移動,則遊戲結束,該法師認輸。

對於已知的臺階數和小和尚的分佈位置,請你計算先發指令的法師該如何決策才能保證勝出。

2、輸入格式

輸入資料為一行用空格分開的 N 個整數,表示小和尚的位置。臺階序號從 1 算起,所以最後一個小和尚的位置即是臺階的總數。(N < 100, 臺階總數 < 1000)

3、輸出格式

輸出為一行用空格分開的兩個整數: A B, 表示把 A 位置的小和尚移動到 B 位置。若有多個解,輸出 A 值較小的解,若無解則輸出 -1。

4、樣例輸入

1 5 9

5、樣例輸出

1 4

二、分析與思路

Nim 遊戲

三、程式碼

#include <bits/stdc++.h>
using namespace
std; #define MAXN 1005 int a[MAXN], tot, o, b[MAXN]; int main() { while (!cin.eof()) cin >> a[++tot]; tot--; for (int i = 1; i < tot; i++) b[i] = a[i + 1] - a[i] - 1; for (int i = 1; i < tot; i += 2) o ^= b[i]; if (o) for (int i = 1; i < tot; i++) {
int t = b[i]; for (int j = 1; j <= t; j++) { b[i - 1]++, b[i]--; o = 0; for (int k = 1; k < tot; k += 2) o ^= b[k]; if (!o) cout << a[i] << ' ' << a[i] + j, exit(0); } b[i - 1] -= t, b[i] += t; } cout << -1; }