藍橋杯第九屆(c/c++b組)題目彙總及解析
x星球的居民脾氣不太好,但好在他們生氣的時候唯一的異常舉動是:摔手機。
各大廠商也就紛紛推出各種耐摔型手機。x星球的質監局規定了手機必須經過耐摔測試,並且評定出乙個耐摔指數來,之後才允許上市流通。
x星球有很多高聳入雲的高塔,剛好可以用來做耐摔測試。塔的每一層高度都是一樣的,與地球上稍有不同的是,他們的第一層不是地面,而是相當於我們的2樓。
如果手機從第7層扔下去沒摔壞,但第8層摔壞了,則手機耐摔指數=7。
特別地,如果手機從第1層扔下去就壞了,則耐摔指數=0。
如果到了塔的最高層第n層扔沒摔壞,則耐摔指數=n
為了減少測試次數,從每個廠家抽樣3部手機參加測試。
某次測試的塔高為1000層,如果我們總是採用最佳策略,在最壞的運氣下最多需要測試多少次才能確定手機的耐摔指數呢?
請填寫這個最多測試次數。
注意:需要填寫的是乙個整數,不要填寫任何多餘內容。
解析:這裡需要用到動態規劃:dp[i][j]表示還有i個手機沒有誰壞,j層樓沒有測試的最佳(最少)測試次數
假設現有2部手機提供測試耐摔指數,假設最後測試出來的耐摔指數為x,
那麼第一次測試x層,若在x層摔壞則從第一層開始測試到x-1層;
第二次測試 若沒有摔壞則測試x+(x-1)層,若在該層摔壞了則從x+1層開始測試到x+x-1-1層;
第三次測試 若沒有摔壞則測試x+(x-1)+(x-2)層,若在該層摔壞了則從x+x層開始測試到x+(x-1)+(x-2)-1層;
綜上最後測試的層數為x(x+1)/2>=1000求得x=44
則這裡可以推出狀態轉移公式:dp[2][j]=min(dp[2][j],1+max(dp[1][k-1],dp[2][j-k])),k∈[1,j-1]
*max(dp[1][k-1],dp[2][j-k])表示在k層摔手機,分為兩種情況:第一種沒有摔壞,那麼需要測試從k+1層開始到j層即[k+1,j],但是題目並沒有說層數越高摔壞的機率越大,相反這裡每一層的摔壞機率都是一樣的,所以[k+1,j]與[1,j-k]是一樣的性質,即dp[2][j-k];第二種摔壞了,那麼就需要從1層開始測試到k-1層,且手機數-1,即dp[1][k-1]。又因為要保證所有情況都測試過了,必須要取兩者之間的最大值,所以max,又因為在k層測試過了一次所以計算的時候要加1
*min(dp[2][j],1+max(dp[1][k-1],dp[2][j-k]))表示取dp[2][j]的最優解,最小次數
現在回到題目的三部手機可以推出狀態轉移公式:dp[i][j]=min(dp[i][j],1+max(dp[i-1][k-1],dp[i][j-k])),k∈[1,j-1]
#includeusing namespace std;
int main()
{ int dp[5][1010];
for(int i=1;i<=3;i++)
for(int j=1;j<=1000;j++)
dp[i][j]=j;//先初始化最壞的情況即測試次數最多的情況
for(int i=2;i<=3;i++)//若只有一部手機了那麼測試次數一定是最壞的情況所以從2開始列舉
for(int j=1;j<=1000;j++)
for(int k=1;k答案:19
第九屆藍橋杯 測試次數
問題描述 x星球的居民脾氣不太好,但好在他們生氣的時候唯一的異常舉動是 摔手機。各大廠商也就紛紛推出各種耐摔型手機。x星球的質監局規定了手機必須經過耐摔測試,並且評定出乙個耐摔指數來,之後才允許上市流通。x星球有很多高聳入雲的高塔,剛好可以用來做耐摔測試。塔的每一層高度都是一樣的,與地球上稍有不同的...
第九屆藍橋杯C B組 測試次數
x星球的居民脾氣不太好,但好在他們生氣的時候唯一的異常舉動是 摔手機。各大廠商也就紛紛推出各種耐摔型手機。x星球的質監局規定了手機必須經過耐摔測試,並且評定出乙個耐摔指數來,之後才允許上市流通。x星球有很多高聳入雲的高塔,剛好可以用來做耐摔測試。塔的每一層高度都是一樣的,與地球上稍有不同的是,他們的...
第九屆藍橋杯省賽 測試次數
參考 x星球的居民脾氣不太好,但好在他們生氣的時候唯一的異常舉動是 摔手機。各大廠商也就紛紛推出各種耐摔型手機。x星球的質監局規定了手機必須經過耐摔測試,並且評定出乙個耐摔指數來,之後才允許上市流通。x星球有很多高聳入雲的高塔,剛好可以用來做耐摔測試。塔的每一層高度都是一樣的,與地球上稍有不同的是,...