week4作業 C TT的神秘禮物

2021-10-04 04:10:04 字數 1443 閱讀 3878

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 的中位數

sample

input

41 3 2 4

31 10 2

sample output18

思路依舊是列舉複雜度為n^2,e18太高了。

這個題需要兩層二分。首先我們把cat數列從小到大排序去掉絕對值號,那麼ans=cat[j]-cat[i],對於我們要找的中位數p,它的範圍為0到cat[n-1]-cat[0],所以我們不用列舉,用二分的方法先從(cat[n-1]-cat[0])/2開始找,那麼問題來了,怎麼判斷中位數是否大於mid呢?判斷名次是否高於mid就可以了,也就是說判斷小於mid的數的個數是否大於中位數的名次,而中位數的名次就是(sizeof(ans)+1)/2,所以我們只需要找到小於mid的數的個數就好了即a[j]-a[i]<=mid,這裡用到我們第二層二分,移項得到a[j]<=a[i]+mid,我們遍歷i,對於每個i我們用二分找出第乙個大於a[i]+mid的數就好了。

**

#include

#include

#include

using

namespace std;

intbisearch

(int

*a,int left,

int right,

int num)

else left=mid+1;

}return ans;

}int

main()

sort

(cat,cat+n)

;int l=

0,r=cat[n-1]

-cat[0]

;int ansm=

((n-1)

*n/2+1

)/2;

while

(l<=r)

if(rk>

((n-1)

*n/2

-ansm)

) l=mid+1;

else r=mid-1;

} cout<1<}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,...