week4 C TT 的神秘禮物

2021-10-04 04:12:07 字數 1604 閱讀 5780

tt 是一位重度愛貓人士,每日沉溺於 b 站上的貓咪頻道。

有一天,tt 的好友 zjm 決定交給 tt 乙個難題,如果 tt 能夠解決這個難題,zjm 就會買乙隻可愛貓咪送給 tt。

任務內容是,給定乙個 n 個數的陣列 cat[i],並用這個陣列生成乙個新陣列 ans[i]。新陣列定義為對於任意的 i, j 且 i != j,均有 ans = abs(cat[i] - cat[j]),1 <= i < j <= n。試求出這個新陣列的中位數,中位數即為排序之後 (len+1)/2 位置對應的數字,』/』 為下取整。

tt 非常想得到那只可愛的貓咪,你能幫幫他嗎?

input:多組輸入,每次輸入乙個 n,表示有 n 個數,之後輸入乙個長度為 n 的序列 cat, cat[i] <= 1e9 , 3 <= n <= 1e5

output:輸出新陣列 ans 的中位數

給出乙個陣列,然後根據這個陣列構造乙個新陣列,求這個新陣列的中位數,這裡利用了二分答案的思想,即最開始中位數會有乙個區間,中位數一定位於這個區間內,二分到乙個可能答案jiashe,求該答案的名次,如果該名次比中位數的名次小,就在jiashe+1到r這個區間找,反之,在l到jiashe區間找,一直利用二分過程,直到low>high,迴圈結束此時的jiashe就是最終要求的中位數。

首先看,怎麼求乙個數的名次,根據新陣列的構建方式ans = abs(cat[i] - cat[j]),1 <= i < j <= n,可知,要知道這個數大於等於ans陣列的多少數,對陣列cat進行排序,問題轉化為即jiashe≥cat[j] - cat[i](1 <= i < j <= n) ,可以通過列舉i,二分j,即cat[j]<=cat[i]+jiashe,找到陣列中最後乙個<=cat[i]+jiashe的索引即可。為了避免不必要的搜尋,優化剪枝,對於每乙個jiashe,從陣列中某個i開始,j從i+1到n-1會一直滿足條件,所以先找到這個臨界值,a[n-1]-a[i]<=jiashe,a[i]>=a[n-1]-jiashe,找到第乙個大於該值的索引。問題轉化為從i從0到這個臨界值的列舉,然後二分搜尋求j。

#include

#include

#include

using

namespace std;

int a[

100100];

intbinarysearch

(int goal,

int left,

int right)

else

}return

(ans-left+1)

;}intbinarysearch_bigger

(int goal,

int left,

int right)

else

}return ans;

}int

getans

(int n)

if(mc>=ansless)

high=jiashe;

else

if(mclow=jiashe+1;

}}intmain

(void

)return0;

}

Week4 C TT 的神秘禮物

給定乙個 n 個數的陣列 cat i 並用這個陣列生成乙個新陣列 ans i 新陣列定義為對於任意的 i,j 且 i j,均有 ans abs cat i cat j 1 i j n。試求出這個新陣列的中位數,中位數即為排序之後 len 1 2 位置對應的數字,為下取整。多組輸入,每次輸入乙個 n,...

week4 C TT的神秘禮物

tt 是一位重度愛貓人士,每日沉溺於 b 站上的貓咪頻道。有一天,tt 的好友 zjm 決定交給 tt 乙個難題,如果 tt 能夠解決這個難題,zjm 就會買乙隻可愛貓咪送給 tt。任務內容是,給定乙個 n 個數的陣列 cat i 並用這個陣列生成乙個新陣列 ans i 新陣列定義為對於任意的 i,...

week4 C TT的神秘禮物

tt 是一位重度愛貓人士,每日沉溺於 b 站上的貓咪頻道。有一天,tt 的好友 zjm 決定交給 tt 乙個難題,如果 tt 能夠解決這個難題,zjm 就會買乙隻可愛貓咪送給 tt。任務內容是,給定乙個 n 個數的陣列 cat i 並用這個陣列生成乙個新陣列 ans i 新陣列定義為對於任意的 i,...