hdu6288(取對數 二分)

2021-09-22 23:00:32 字數 1382 閱讀 1482

缺失的資料範圍

著名出題人小q出過非常多的題目,在這個漫長的過程中他發現,確定題目的資料範圍是非常痛苦的一件事。

每當思考完一道題目的時間效率,小q就需要結合時限以及評測機配置來設定合理的資料範圍。 因為確定資料範圍是一件痛苦的事,小q出了非常多的題目之後,都沒有它們設定資料範圍。對於一道題目,小q會告訴你他的演算法的時間複雜度為o(nalogbn)o(nalogb⁡n),且蘊含在這個大oo記號下的常數為11。同時,小q還會告訴你評測機在規定時限內可以執行kk條指令。小q認為只要na(⌈log2n⌉)bna(⌈log2⁡n⌉)b不超過kk,那麼就是合理的資料範圍。其中,⌈x⌉⌈x⌉

表示最小的不小於xx的正整數,即xx上取整。

自然,小q希望題目的資料範圍nn越大越好,他希望你寫乙個程式幫助他設定最大的資料範圍。 input第一行包含乙個正整數t(1≤t≤1000)t(1≤t≤1000),表示測試資料的組數。

每組資料報含一行三個正整數a,b,k(1≤a,b≤10,106≤k≤1018)a,b,k(1≤a,b≤10,106≤k≤1018),分別描述時間複雜度以及允許的指令數。output對於每組資料,輸出一行乙個正整數nn,即最大可能的nn。

sample input3

1 1 100000000

2 1 100000000

1 3 200000000

sample output

4347826

2886

48828

嗯。。數學題。。不會。。

二分,等式兩邊同時取對數,注意精度。

ac**(抄的別的部落格):

#include

using namespace std;

typedef

long

long ll;

ll t,n,m,i,a,b,k,ans;

ll fast

(ll x,ll y)

return num;

}ll logn2

(ll m)

}int

judge

(ll mid)

m=logn2

(mid)

;///取整,這裡卡ceil()!!!還是自己寫叭

if(m==0)

return1;

///確保下面分母不為零,n=1時

else}if

(num1<=k/num2)

///小於給定值,是為了防爆嗎??

return1;

else

return0;

}int

main()

cout<'\n';}

return0;

}

不知道為啥把快速冪換成1<還不知道這樣做為啥取對數時不會有損失。(期待大佬解答!)

hdu6288 缺失的資料範圍(二分,大數)

題意 給定a,b,k,要求找到乙個最大的n,滿足na log 2n 2 k n a lceil log n rceil 2 k na lo g2 n 2 k 資料範圍 1 a,b 10,1e6 k 1e18 解法 顯然n是單調的,那麼二分n即可。然而會爆longlong,有的人unsigned過了,...

hdu 6288 二分法加精度處理問題)

題意 給出a,b,k,n可滿足 n a log2n b k k 求最大的n值 三個正整數a,b k 1 a,b 10,10 6 k 1018 a,b,k 1 a,b 10,10 6 k 10 18 題目思路 這類給數學式子求n的最大值,且資料量大且多的,考慮時間複雜度,我們採用二分法找出n 思路 很...

HDU 6231 (二分 尺取)

所求的一定是a陣列中的原素,這點毋庸置疑,所以在a陣列中任意選則其中的乙個數x,若a的所有長度不小於k的連續子串行中第k大數不小於x的子串行一共有ans個,那麼x在所有第k大元素組成的數列中至少是第ans大數 因為ans n r,因為之前的x已經是第k大了,所以加上後面的元素,如果比他小,則沒有影響...