藍橋杯之取球問題

2021-07-25 10:42:48 字數 1123 閱讀 3853

今盒子裡有n個小球,a、b兩人輪流從盒中取球,每個人都可以看到另乙個人取了多少個,也可以看到盒中還剩下多少個,並且兩人都很聰明,不會做出錯誤的判斷。    

我們約定:         

每個人從盒子中取出的球的數目必須是:1,3,7或者8個。    

輪到某一方取球時不能棄權!     

a先取球,然後雙方交替取球,直到取完。     

被迫拿到最後乙個球的一方為負方(輸方)     

請程式設計確定出在雙方都不判斷失誤的情況下,對於特定的初始球數,a是否能贏?     程式執行時,從標準輸入獲得資料,其格式如下:     

先是乙個整數n(n<100),表示接下來有n個整數。然後是n個整數,每個佔一行(整數<10000),表示初始球數。

程式則輸出n行,表示a的輸贏情況(輸為0,贏為1)。    

例如,使用者輸入: 4 1 2 10 18       

則程式應該輸出: 0 1 1 0      

分析:定義flag存放最終陪你過輸出結果,初始值都為0,b存放一次可以取的個數,即1,3,7,8,a接受原始輸入的n個數,在接收輸入資料的同時求出n個數中的最大數賦給變數max。從2開始迴圈,一一判斷。判斷flag[i]時,可以根據flag[i-b[j]]來求得flag[i].

2.3.4,5,6......,max

假定flag[i-b[j]]為0,最終結果flag[i] = 1,表明a取勝。由於a先取數,讓a第一次先選擇b[i]個球,這時剩下i-b[j]個球,根據flag[i-b[j]]的值即可判斷a是輸是贏 。因為對於i-b[j]個球無論怎樣取的結果已經求出,若a輸了,那此時b先取球(相當於a與b交換下順序),所以b輸時,那麼a就是贏的,flag[i] = 1.

而flag[i-b[j]]為1,推理過程與上面一樣,flag[i] = 0.

程式**如下:

#include int main()

; int flag[10001] = ;

int n;

int max = 0;

int i,j;

scanf ("%d",&n);

for (i=0; imax)

}for (i=2; i<=max; i++)

{ for (j=0; j<4&&b[j]

java藍橋杯 取球問題

問題 今盒子裡有n個小球,a b兩人輪流從盒中取球,每個人都可以看到另乙個人取了多少個,也可以看到盒中還剩下多少個,並且兩人都很聰明,不會做出錯誤的判斷。我們約定 每個人從盒子中取出的球的數目必須是 1,3,7或者8個。輪到某一方取球時不能棄權!a先取球,然後雙方交替取球,直到取完。被迫拿到最後乙個...

藍橋杯取球博弈

題目 取球博弈 兩個人玩取球的遊戲。一共有n個球,每人輪流取球,每次可取集合中的任何乙個數目。如果無法繼續取球,則遊戲結束。此時,持有奇數個球的一方獲勝。如果兩人都是奇數,則為平局。假設雙方都採用最聰明的取法,第乙個取球的人一定能贏嗎?試程式設計解決這個問題。輸入格式 第一行3個正整數n1 n2 n...

藍橋杯 取球博弈

取球博弈 今盒子裡有n個小球,a b兩人輪流從盒中取球,每個人都可以看到另乙個人取了多少個,也可以看到盒中還剩下多少個,並且兩人都很聰明,不會做出錯誤的判斷。我們約定 每個人從盒子中取出的球的數目必須是 1,3,7或者8個。輪到某一方取球時不能棄權!a先取球,然後雙方交替取球,直到取完。被迫拿到最後...