尋找明星
題目描述:有n個人,其中乙個明星和n-1個群眾,群眾都認識明星,明星不認識任何群眾,群眾和群眾之間的認識關係不知道,現在如果你是機械人r2t2,你每次問乙個人是否認識另外乙個人的代價為0(1),試設計一種演算法找出明星,並給出時間複雜度。
解法一:看到題目後,首先想到的是任選其中乙個人作為目標物件,然後詢問剩下的n-1個人。若當前目標不認識其他人,但是其他人認識ta,則目標就是明星,否則,目標不是明星,在選擇其他人作為目標做同樣的詢問。時間複雜度為o(n*n).
解法二: 在解法一中,每次只是做了詢問而沒有記錄相關的資訊,
比如在詢問a和b時,有以下幾種關係:
1) a不認識b, b不認識a。==> a和b都不是明星
2)a認識b, b認識a。==> a和b都不是明星
3) a認識b, b不認識a。==> a不是明星,b可能是明星。
4)a不認識b, b認識a。==> a可能是明星,b一定不是明星
因為每次詢問都可以至少排除乙個物件,因此只需要n-1次詢問即可找到目標。
偽碼如下:
bool recognize( int a, int b );
bool findstar( int array, int n, int &answer )
// 不認識i, 則i肯定就不是明星了
++i; }
for( i = 0; i < n; ++i )
}} answer = star;
return true;
}
因為原問題中可能不存在明星,因此在最後必須要對所求答案逐一驗證。
分析:在遇到問題時,將問題的規模減小是乙個較好的計算機解題方法。時間複雜度為o( n );
MySQL趣味題 Hankson的趣味題
思路 由於x是b1的約數,所以x的質因子一定也是b1的質因子,我們可以對b1的每個質因子p,分別計算a0,a1,b0,b1分別 包含多少個p.然後討論x可能含有幾個p即可 include include include include include include using namespace ...
python趣味題 python 趣味百題3
等差素數數列 類似7 37 67 97 107 137 167 197這樣由素數組成的數列。素數數列具有項數的限制,一般指素數數列的項數有多少個連續項,最多可以存在多少個連續項 程式設計找出100以內的等差素數數列 思路 1.篩法找出100以內所有素數 2.對於素數list內兩兩組合,構造等差數列a...
趣味百題之趣味猜想
coding utf 8 import sys reload sys sys.setdefaultencoding utf 8 created on wed dec 07 18 43 25 2016 趣味百題之趣味猜想 author onlyyo 1.角谷猜想的內容為 任意給定乙個自然數,若它為偶數...