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