1.4.34熱還是冷。你的目標是猜出1到n之間的乙個秘密的整數。每次猜完乙個整數後,你會知道你的猜測和這個秘密整數是比較熱(接近)還是比較冷(遠離)。設計乙個演算法在~2lgn之內找到這個秘密整數,然後再設計乙個演算法在~1lgn之內找到這個秘密整數。
答:解決2lgn中的不得不在每一次猜兩個數就實現了lgn要求。 要達到最多使用lgn次猜數就可以猜出秘密數,那麼要確保每一次猜數都能將秘密數所在的區間減半。
演算法:為了確保通過每乙個猜數的溫變資訊能將秘密數所在區間減半,只要以秘密數所在區間的中點作為對稱點,將當前猜數的對稱數作為新的猜數即可。但新的猜數有時會不在1~n區間,如果題意要求猜數只能是1~n的數,不適用此演算法。
初始時秘密數區間為1~n,先猜1,秘密數是1時猜中,不是1時再猜n。秘密數是n時猜中,秘密數即不是1也不是n時,如果n相對1變冷說明秘密數離1近,那麼秘密數在1~n/2區間,如果變熱說明秘密數離n近,那麼秘密數在n/2~n區間,由此將秘密數所在的區間減半,如果即不變冷也不變熱,說明秘密數在區間的中間。
區間在每一次猜數後縮減,每次只會對左右邊界中的乙個邊界進行調整到達縮減效果,要麼調整左邊界,要麼只調整右邊界。變冷時調整的是離當前猜數近的邊界,變熱時調整的是離當前猜數遠的邊界。確定新的區間後找到新區間的中點,然後計算出中點與當前猜數的距離,然後再計算出新的猜數。
public class e1d4d34b
//end main
public static int guesskey(int n,int key)
//end if hot
else if(math.abs(g1-key)math.abs(g2-key))//hot
//end if hot
else if(math.abs(g1-key)
2)
Algs4 1 5 17隨機連線
1.5.17隨機連線。設計uf的乙個用例 erdosrenyi,從命令列接受乙個整數n,在0到n 1之間產生隨機整數對,呼叫connected 判斷它們是否相連,如果不是則呼叫union 方法 和我們的開發用例一樣 不斷迴圈直到所有觸點均相互連通並列印出生成的連線總數。將你的程式打包成乙個接受引數n...
Algs4 1 3 31隨機連線
1.3.31隨機連線。編寫一段程式,從命令列接受乙個整數n和double值p 0到1之間 作為引數,在乙個圓上畫出大小為0.05且間距相等的n個點,然後將每對點按照概率p用灰線連線。public class test for int i 0 i points.length i for int j 0...
HNCU 1746 演算法4 1,4 3 定位子串
題目描述 將子串在母串中第一次出現的位置找出來。圖1 在母串中第pos個位置定位子串的演算法 圖2 從母串中第pos個位置獲得長度為len的子串 輸入 若干對字串,每對字串佔一行並用乙個空格分開。前乙個字串為母串,後者為子串。字串只包含英文本母的大小寫。每個字串不超過98個字元。輸出 輸出子串在母串...