給定乙個 n 個數的陣列 cat[i],並用這個陣列生成乙個新陣列 ans[i]。新陣列定義為對於任意的 i, j 且 i != j,均有 ans = abs(cat[i] - cat[j]),1 <= i < j <= n。試求出這個新陣列的中位數,中位數即為排序之後 (len+1)/2 位置對應的數字,』/』 為下取整。
多組輸入,每次輸入乙個 n,表示有 n 個數,之後輸入乙個長度為 n 的序列 cat, cat[i] <= 1e9 , 3 <= n <= 1e5 。
41 3 2 4
31 10 2
輸出新陣列 ans 的中位數18
對於輸入的cat序列,我們可以通過等差數列求和公式得知其經過處理後的陣列大小,從而可以知道要求的中位數的排名,也就知道了小於中位數的數的個數。
我們將cat序列進行公升序排序,則ans陣列可由後乙個數減去前乙個數求得,從而可以去除絕對值,同時我們也可給出中位數的範圍,即0到cat[n]-cat[1]。
因為答案具有單調性,我們可以考慮二分的做法,對中位數的範圍進行二分,然後根據二分得到的數p,將其與中位數比較排名,若其大於中位數,則中位數在前半部分,繼續二分前半部分,否則二分後半部分。
最後乙個問題就是判斷小於p的數有多少個,我們遍歷i,求取j的範圍,可得到小於p的資料個數記作sum,同時我們也求取等於p的資料個數記作equal。記中位數排名為m,若sum=m說明p就是中位數,若equal+sum#include
#include
using
namespace std;
intfind
(int
*v,int x,
int n,
int i)
else
r=mid-1;
}return ans;
}int
main()
else
for(
int j=i+
1;j==(input[i]
+mid)
;j++
) equal++;}
if(sum(equal+sum)
>=m)
break
;else
if(equal+suml=mid+1;
else
r=mid-1;
} cout << mid << endl;
}return0;
}
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,...
week4 C TT 的神秘禮物
tt 是一位重度愛貓人士,每日沉溺於 b 站上的貓咪頻道。有一天,tt 的好友 zjm 決定交給 tt 乙個難題,如果 tt 能夠解決這個難題,zjm 就會買乙隻可愛貓咪送給 tt。任務內容是,給定乙個 n 個數的陣列 cat i 並用這個陣列生成乙個新陣列 ans i 新陣列定義為對於任意的 i,...