題目看這裡
乙個非常好的逆向思維題(都是套路233)
如果直接做發現其實可以做,但是資料範圍太大不能過了,具體做法參考這裡
開始正文:
首先,我們設f[
i,j]
表示' role="presentation">f[i
,j]表
示f[i
,j]表
示在有i個棋子的情況下,扔j次能保證測出的樓層最高是多少,顯然如果n可以被測出,那麼n-1也可以被測出
於是考慮一下最優策略是什麼
在高度h扔乙個棋子下去,如果碎了,那麼說明高度
<
' role="presentation"><
<
h,如果沒碎說明高度》=h
於是可以寫出f[
i,j]
=f[i
−1,j
−1]+
f[i,
j−1]
+1' role="presentation">f[i
,j]=
f[i−
1,j−
1]+f
[i,j
−1]+
1f[i
,j]=
f[i−
1,j−
1]+f
[i,j
−1]+
1發現這個式子,f[i]大約是i次多項式的級別
所以對於i=1,i=2需要特判:f[
1][j
]=j,
f[2][j]
=j∗(
j+1)
2' role="presentation">f[1
][j]
=j,f
[2][
j]=j
∗(j+
1)2f
[1][
j]=j
,f[2
][j]
=j∗(
j+1)
2剩下的直接dp就可以了
回答每乙個詢問在
f' role="presentation">f
f二分就可以了
#pragma gcc optimize("o3")
#pragma g++ optimize("o3")
#include
#include
#include
#include
#include
#define n 2000000
#define ll unsigned long long
using
namespace
std;
vector
f[65];
ll n,m; int t;
int main()
}for(scanf("%d",&t);t--;) else
}}
51Nod1306 高樓和棋子
題目看這裡 乙個非常好的逆向思維題 都是套路233 如果直接做發現其實可以做,但是資料範圍太大不能過了,具體做法參考這裡 開始正文 首先,我們設f i,j 表示f i,j 表 示在有i個棋子的情況下,扔j次能保證測出的樓層最高是多少,顯然如果n可以被測出,那麼n 1也可以被測出 於是考慮一下最優策略...
51Nod1306 高樓和棋子 動態規劃
有個n層的高樓和若干個棋子,所有的棋子都是一樣的。棋子從樓的某層e扔到地上不會碎 0 e n 但從比這個樓層高的地方扔到地上都會碎。給出樓的高度n,以及棋子的數量m,你來找出這個e 0 e n 問最壞情況下需要實驗多少次才能計算出準確的e 如果棋子摔碎了,就不能繼續用這個棋子進行測試了 1 n 10...
51nod1534 棋子遊戲
1534 棋子遊戲 基準時間限制 1 秒 空間限制 131072 kb 分值 20 難度 3級演算法題 還有一些其它的限制,他們不能把棋子移動到x或y為負的座標,或者移動到已經被對手佔據的座標。最先到達 0,0 的人獲勝。現在給定他們棋子的座標,判斷一下誰會獲勝。input 單組測試資料。第一行包含...