分治思想解決演算法問題

2022-10-10 21:57:15 字數 1685 閱讀 6574

不多bb,\(o(n^2)\)

#include using namespace std;

void solve()

; int f[5000]=;

int m;

cin >> m;

for (int i = 0; i < m; i++)

cin >> a[i];

f[0] = 0;

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

f[i] = f[i - 1] + sum;

} cout << f[m - 1] << endl;

}int main()

return 0;

}

在待排序序列長度為 1 的時候,遞迴開始「回公升」,因為我們預設長度為 1 的序列是排好序的。

#include using namespace std;

int mergesort(int *nums, int *tmp, int l, int r) //左指標超出右指標,迴圈結束

int mid = (l + r) / 2;

int inv_count = 0;

inv_count+=mergesort(nums, tmp, l, mid) + mergesort(nums, tmp, mid + 1, r);//遞迴迴圈

int i = l, j = mid + 1, pos = l;//i,j為左右指標,pos為臨時陣列tmp的指標

while (i <= mid && j <= r)

else

++pos;

}for (int k = i; k <= mid; ++k)

for (int k = j; k <= r; ++k)

for(int i=l;i<=r;i++)

//copy(tmp.begin() + l, tmp.begin() + r + 1, nums.begin() + l);//這裡是把排序好的tmp陣列複製給nums

return inv_count;

}void solve()

cout << mergesort(a,sum,0,n-1) << endl;

}int main()

return 0;

}

思路

1.求逆序對數量,我們只要求每個數後面有多少個數比這個數小,採用樹狀陣列解決

2.將每個數離散化,用二分查詢找到每個數對應的離散後的值

3,求解時,從後往前列舉,先統計後面有多少個數比這個數小,然後在把它加到樹中

**實現(用vector比較好寫,這裡就不寫了)

不贅述

HashMap與衝突解決演算法

hash map是經常被使用的一種資料結構,而其實現方式也是多種多樣。如果要求我們使用盡可能簡單的方式實現hash map,具體該如何做呢?我們知道hash map最重要兩個概念是hash函式和衝突解決演算法。hash map鍵 值之間的對映關係,hash函式將鍵對映為記憶體位址,衝突解決演算法用於...

漢諾塔問題解決演算法

問題描述 假設有3 個分別命名為x,y,z的塔座,在塔座 x上插有 n個直徑大小各不相同 依小到大編號為1,2,n個圓盤。現要求將 x軸上的 n個圓盤移至塔座 z上並仍按同樣順序疊排,圓盤移動時必須遵守下列規則 1 每次只能移動乙個圓盤 2 圓盤可以插在x,y和z中的任一塔座上 3 任何時刻都不能將...

蛙跳台階問題解決演算法

題目 乙隻青蛙可以一次跳上一級台階,也可以一次跳上二級,求該青蛙跳上乙個n級台階總共有多少種跳法1 解題思路 我們把n級台階的跳法看成是n的函式,記為f n 當n 2時,第一次調的時候就有兩種不同的選擇,一是第一次跳一級,則此時的跳法數目等於後面剩下的n 1級台階的跳法數目,即為f n 1 另一種選...