題目大意:
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
4sample output1 3 2 4
31 10 2
18思路:兩次二分-淋漓盡致
這道題目知道是用二分的思想做,但是做的時候卻卡了好幾天,怎麼二分呢?
這個時候就要回到中位數的定義中去:大小排序後最中間位置,即(n*(n-1)/2+1)/2
新陣列中最大數為原陣列中最大數與最小數之差,然後可以對這個值二分。要判斷其在新陣列中的位置,即找在新陣列中有多少比他大或小。這一步又要用到二分的思想,對於固定的數,找滿足條件的數的個數(原陣列二分 找滿足差的個數 )
1/*2name: 34
author:sduallen
5date: 19/03/20 11:44
6description: 7*/
89 #include10 #include11 #include12 #include13
using
namespace
std;
1415
//const int max = 1e5+1;
16int *cat = new
int[100001
];17
intn;
18int last_index(int start)
26else
27 r=mid-1;28
}29return
index;30}
3132
intmain()
50if(cnt >=ans_mid)
54else
55 l=mid+1;56
}57 printf("
%d\n
",themid); 58}
59return
0;
60 }
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,...