華為機試 撿石子

2021-06-22 18:26:31 字數 810 閱讀 4481

昨天去華為機試,前兩道都比較簡單,最後一道是關於撿石子的問題,當時沒想到好的辦法解決,8個測試用例只過了6個,回來想了想,想到了一種能解決的方法。

題目:有n(n>=2)個石子,甲乙兩個人從這些石子中輪流拿取m(m>=1)個石子,規定第乙個拿的人可以拿任意多個,但不能完全拿完,然後,後面的人最多可以拿取前面人的2倍,最後乙個拿完石子的人獲勝。第乙個獲勝的人輸出1,第二個人獲勝輸出2。

舉例:一共有10個石子,甲先拿,那甲剛開始最少拿1個,最多拿9個(不能拿完)。假如甲拿2個,則乙最少拿1個,最多 拿4個(2的兩倍)。若乙拿2個,則甲最少拿1個,最多拿4個。以此類推,直到一方把所有石子都拿完而獲勝。

解析:雖然第乙個人可以拿任意多個,但是後面的人最多可以拿他所拿石子的2倍,那麼第乙個人最多不能拿超過總數的1/3,等於1/3也不可以,必須小於1/3。後面的人也是如此。則兩個人每次最多拿(n-1)/3,由於最少要拿乙個,則每次最多拿 t=max,remaining為剩餘石子數量。定義乙個一維陣列c[0...n](0,1位置不用),陣列的第i個元素c[i]表示石子個數為i時勝出的一方(1或者2)。上面已經講了,一方每次最多拿t=max個,最少可以拿1個,則每次可以拿count=個。

講到這差不多就知道怎麼做了。如果現在剩餘remaining個,現在拿石子的一方可以拿count(count=1...t)個,則此時拿完count個後,還剩餘remaining-count個。由於之前陣列c 已經儲存了c[remaining-count]的大小,也就是勝出一方,則我們可以在remaining-1到remaining-t中尋找是否有2(因為此時代表後邊的人先取,如果自己想要贏,尋找的數中必須有2),如果有,則先取的人會贏;否則,後取得人會贏。

華為機試整理

include stdafx.h includeusing namespace std int main int argc,tchar argv cout 2.大數相加 用stl的string比較方便,如下,自己測了幾組資料沒有什麼問題。include stdafx.h include includ...

華為機試 2013

1.字串轉換 問題描述 將輸入的字串 字串僅包含小寫字母 a 到 z 按照如下規則,迴圈轉換後輸出 a b,b c,y z,z a 若輸入的字串連續出現兩個字母相同時,後乙個字母需要連續轉換2次。例如 aa 轉換為 bc,zz 轉換為 ab 當連續相同字母超過兩個時,第三個出現的字母按第一次出現算。...

華為機試3

明明想在學校中請一些同學一起做一項問卷調查,為了實驗的客觀性,他先用計算機生成了n個1到1000之間的隨機整數 n 1000 對於其中重複的數字,只保留乙個,把其餘相同的數去掉,不同的數對應著不同的學生的學號。然後再把這些數從小到大排序,按照排好的順序去找同學做調查。請你協助明明完成 去重 與 排序...