小Q的最小值序列

2021-09-26 14:44:14 字數 1208 閱讀 7641

1.【題目描述】

小 q 得到了乙個長度為 n 的序列 a,a 中的數各不相同。對於 a 中的每乙個

數 ai,求:min(1≤j2.【問題分析】

1.暴力破解的代價太大。進一步考慮,如果輸入序列有序,那麼每次檢索比較的範圍可以縮小到三個數之間

2.問題要求輸出相應pi的值,則選用陣列等資料結構不可取,需要借助使用者自定義型別,這裡我們選擇雙向鍊錶,由於初始化(即插入)工作一次完成,後邊不做修改,可以將其簡化為靜態雙向鍊錶

3.需要借助輔助陣列來維護原始序列的元素位置和下標。

3.【圖示】

/*小q的最小值序列

31 5 3

*/const int n = 1e5 + 5; //開闢陣列的空間大小

const int inf = 1e9;

struct p

;p a[n];

int cmp(p x, p y)

int b[n], b2[n], cnt, head, tail, ans1[n], ans2[n];

struct node

e[n];

void init() //初始化乙個靜態的雙向鍊錶

void ins(int pos, int x) //相當於雙向鍊錶的插入操作

void del(int pos) //相當於雙向鍊錶的刪除操作

int main()

sort(a+1, a+1+n, cmp); //經過排序操作,下標將會打亂次序

init();

for (int i = 1; i <= n; ++i)

for (int i = n; i >= 2; --i)

if (e[b[i]].pre != head) //從最後乙個元素開始

} del(b[i]); //極其重要

} for (int i = 2; i <= n; ++i)

return 0;

}4.【執行結果】

最小值和第二小值

這個問題來自演算法導論的習題9.1 1.問題是這樣的 證明 在最壞情況下,利用n lgn 2次比較,即可找到n個元素中的第二小元素。證明 構造出這種比較方法就可以了。看見lgn就應該想到配對。實際上,將n個元素兩兩分組進行比較,選取每次比較中的較小元素,這樣一來,可以一直做下去直到得到最小元素,這需...

同時尋找序列的最大最小值

問題描述 給定乙個長度為n n 2 的無序正整數序列ary,要求同時找到其中最大和最小值元素,並返回其和。分析 將最大值max和最小值min看成一對 mix,min 每次從序列中成對地取出兩個元素,將其中較小者與min比較並更新,將其中較大者與max必將並更新,這樣處理每一對元素只需要3次比較,整個...

滑動最小值

時間限制 1 sec 記憶體限制 128 mb 提交 127 解決 27 提交 狀態 討論版 命題人 admin 題目描述 給定乙個長度為 n 的數列 a0,a1,an 1和乙個整數k。求數列 bi min ai,ai 1 ai k 1 i 0,n 特別的,對於 i n k 的 bi 0。輸入第一行...