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,...