演算法課複習 分治

2021-09-09 01:35:20 字數 3471 閱讀 7356

hdu #5178 : pairs

傳送門:

題意:n個數,問有多少對數差值小於k。

思路:排個序,開個佇列。每次乙個新的數先把比它小的都從佇列中去了,然後答案加上佇列大小,最後把自己塞進佇列。按順序走一遍行了。

ac**:

#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define p pair#define ll long long

#define ull unsigned long long

#define lson id*2,l,mid

#define rson id*2+1,mid+1,r

#define ls id*2

#define rs (id*2+1)

#define mod(a,b) aq;

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

}int main()

return 0;

}

openj_bailian #2299 : ultra-quicksort

傳送門:

題意:給出一串數,每個數只能和相鄰的數交換位置,問最少交換多少次能使這一串數從小到大排序。

思路:求逆序對個數,樹狀陣列直接做就行了。或者歸併排序來做也可以。

ac**:

#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define p pair#define ll long long

#define ull unsigned long long

#define lson id*2,l,mid

#define rson id*2+1,mid+1,r

#define ls id*2

#define rs (id*2+1)

#define mod(a,b) amp;

void init()

void add(int x)

int query(int x)

int main()

sort(a + 1, a + n + 1);

cnt = 0;

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

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

b[i] = mp[b[i]];

cl0(a);

ll ans = 0;

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

printf("%lld\n", ans);

} return 0;

}

hdu #2083 : 簡易版之最短距離

傳送門:

題意:給出n個點,選擇乙個點使得所有點到它的距離之和最小,問最小距離和是多少。

思路:直接找最中間位置的點就可以了。

比如對於a、b兩個點(a<=b),選擇點c,若a<=c<=b則無論c在哪都有|ac|+|cb|=|b-a|;否則|ac|+|cb|>=|b-a|

ac**:

#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define p pair#define ll long long

#define ull unsigned long long

#define lson id*2,l,mid

#define rson id*2+1,mid+1,r

#define ls id*2

#define rs (id*2+1)

#define mod(a,b) aopenj_bailian #1064 : cable master

傳送門:

題意:給n塊木頭,以及最終需要的塊數k。求出問把木頭切成k塊後,其中最短的那塊的最大值。

思路:二分答案。精度問題的話可以直接*100轉化成整數來求,或者二分個幾百次。

ac**:

#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define p pair#define ll long long

#define ull unsigned long long

#define lson id*2,l,mid

#define rson id*2+1,mid+1,r

#define ls id*2

#define rs (id*2+1)

#define mod(a,b) a= k)

l = mid;

else

r = mid;

} int a1 = l / 100, a2 = l % 100;

printf("%d.", a1);

if (a2 < 10)printf("0");

printf("%d\n", a2);

} return 0;

}

openj_bailian #2456 : aggressive cows

傳送門:

題意:有n個牛棚,c頭牛。牛比較兇猛所以它們太近了要打架。給出n個牛棚的位置,每個牛棚放乙隻牛,問兩隻牛之間的最短距離的最大值是多少。

思路:二分答案。預設1號位置放牛,之後隔著dis位置的牛棚放牛,看放不放的下。

ac**:

#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define p pair#define ll long long

#define ull unsigned long long

#define lson id*2,l,mid

#define rson id*2+1,mid+1,r

#define ls id*2

#define rs (id*2+1)

#define mod(a,b) a0)

return true;

}int main()

printf("%d\n", l);

} return 0;

}

演算法複習 分治演算法

先來看乙個經典的二分查詢例子。int binarysearch vector nums,int target return 1 時間複雜度是 o logn 我們看到,二分查詢貫徹了分治的思想。當我們要解決乙個輸入規模較大 不妨設為 n 的問題時,可以將這個問題分解成 k 個不同的子集,如果能得到 k...

複習一 分治演算法

臨近期末,把之前做過的題目 有部分是未做過的 重新做一遍,整合到一起,為了省時間,就不貼 了,只分析思路。分治演算法題目 1 search a 2d matrix ii 在乙個每行每列都有序的矩陣中搜尋某一數字。2 kth largest element in an array 找到陣列裡第k大元素...

演算法設計與分析複習 分治法演算法描述

分治 劃分 解子問題 組合 每個遞迴演算法均可以轉換為迭代演算法 include include 尋找最大最小元素,最大比較次數 3 n 2 2 minmax low,high if high low 1 if arr low arr high return arr low arr high els...