求個最大值(技巧 二分轉化)

2021-07-31 12:46:07 字數 1403 閱讀 6087

時間限制: 1 sec  

記憶體限制: 128 mb

提交: 267  

解決: 52 [

提交][

狀態][

討論版]

給出 n(1 <= n <= 200000)個數字 ai(1 <= ai <= 1000000),i 為數字的下標,按輸入順序從 1 開始編號

一直到 n,求滿足 ai >= aj 的最大的 ai % aj。 

第一行乙個數字 n,第二行 n 個整數。 

題目要求的最大值。 

2

2 3

1

題解:

排序去重之後,對1到 max中的每個數字x求出小於x的最大 ai,記為 b[x]。 對於每個 ai 列舉它的倍數即可,時間複雜度 o(max + nlogn) 。

這題比賽裡已經想到思路了,就是不知道怎麼去表示。。 思路很簡單,設a, b , a > b -> a/b = k....r(r是餘數),這樣我們肯定希望a離著k*b越元越好。也就是我們列舉倍數的時候(比賽中寫過列舉倍數,但是n*n的。。)我們希望b*k離著a越遠越好,但是不能遠過b的大小,這樣就難處理了,但是可以轉化成 (k+x)*b離著a越近越好,那列舉到每個數的倍數時候,對他有用的就只有乙個離著這個數最近的a【i】了、、字首處理下就好了。。記錄1-maxn*2每個數比他小但是最大的a[i]就行。。

這個問題中有幾個點還是比較巧妙的!!!

(1)求的是a[j]>a[i] 且a[j]%a[i]的最大值,如果把研究a[j]的話問題是不好解決的,需要轉化一下,也就是上面的這個轉化過程,用倍數來想

(2)開始的時候我是感覺這樣會超時的,因為開始的時候如果a[i]=2,這需要(200000*2)/2=200000的,然後每個數按照這種最壞的想,也就是200000*20000,這明顯是會超時的,但是之後計算之後發現最大值是134565766,也就是說複雜度是1e7,不會超時的,其實這就是個調和級數計算方式(調和級數的值:n趨近與無窮後是:1/1+1/2+1/3...+1/n~ln(n+1) +r,r是尤拉常數,r=

0.5772156649.),就是高數級數裡面乙個簡單的概念好不好,都忘了。。還有這裡其實就是放縮放錯了,放縮方法分兩種的好不好,張宇十八講上好像看過

(3)想要找到最接近a[j]的某個值,第一想法肯定是二分思想比較快,但是這裡又是做了乙個巧妙的思想,就是用了這個輔助陣列,所以查詢就直接是o(1)了,相當巧妙,學習了!!!

#include using namespace std;

const int maxn = 1e6 + 10;

int b[maxn], a[maxn];

int main()

return 0;

}

還有網上有的說二分可以,按照上面複雜度計算是不可以的,並且競賽之後發現已經回tl了!!!

二分 最小化最大值

注意答案的二分性質,必須要滿足在滿足給定條件的所有情況的時候都滿足要求才能更新ans。include using namespace std typedef long long ll inline ll in while c 0 c 9 res res 10 c 48,c getchar retur...

二分求最小間距的最大值

mad jim jaspers為了證明釹磁鐵的強大,拿來了乙個有nnn個小槽的長木條,mmm個釹磁鐵,第iii個小槽在xix ixi 的位置上,為了不讓磁鐵互相吸引,每塊磁鐵離其他磁鐵的距離應該盡可能的大。請你幫mjj寫乙個程式,求出所有磁鐵之間最小距離的最大值。只要磁鐵距離大於等於1就不會互相吸引...

二分查詢求最大值最小化(最小值最大化)問題

題目描述 這項比賽將在一條筆直的河道中進行,河道中分布著一些巨大岩石。組委會已經選擇好了兩塊岩石作為比賽起點和終點。在起點和終點之間,有 nn 塊岩石 不含起點和終點的岩石 在比賽過程中,選手們將從起點出發,每一步跳向相鄰的岩石,直至到達終點。為了提高比賽難度,組委會計畫移走一些岩石,使得選手們在比...