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。輸入第一行...