Week4 C TT 的神秘禮物

2021-10-04 03:47:15 字數 1181 閱讀 3367

給定乙個 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,...