貪心演算法(持續更新)

2021-09-23 18:10:56 字數 3935 閱讀 6847

思想:貪心演算法的每一步都有嚴格的證明過程,但我們肯定無法證明過後再去做題。因而,如果在想到某個似乎可行的策略,並且自己無法舉出反例,那麼就勇敢地實現它

eg1. 區間不相交問題——給出n個開區間(x,y),從中選擇盡可能多的開區間,使得這些開區間兩兩沒有交集。

//先選擇左端點最大的區間,若左端點相同選右端點最小的區間,保證所選區間盡可能離散。

#include

#include

#include

using

namespace std;

const

int maxn =

110;

struct inteval

i[maxn]

;bool

cmp(inteval a, inteval b)

else

}int

main()

sort

(i, i+n, cmp)

;int ans =1;

// 不相交區間個數

int last_left = i[0]

.left;

// 上一條被選取的區間的左端點

for(

int i=

1; i

printf

("%d\n"

, ans);}

fclose

(stdin);

return0;

}

eg2. 區間選點問題——給出n個閉區間[x,y],求最少需要確定多少個點,才能使每個區間中都至少存在乙個點。

//先選擇左端點最大的區間,若左端點相同選右端點最小的區間,保證所選區間盡可能離散。

#include

#include

#include

using

namespace std;

const

int maxn =

110;

struct inteval

i[maxn]

;bool

cmp(inteval a, inteval b)

else

}int

main()

sort

(i, i+n, cmp)

;int ans =1;

// 不相交區間個數

int last_left = i[0]

.left;

// 上一條被選取的區間的左端點

題目大意:

給出若干可能有前導0的數字串,將它們按某個順序拼接,使生成的數最小。

思路分析:

此題不是單純的字典序排序問題,例如按字典序32<321,但32+321=32321,大於321+32=32132,所以按字典序遞增這種貪心思想是錯誤的。

其實不難理解,我們所追求的就是當s1+s2細節注意:

1)結果串的前導0要去掉,但如果結果就是0則應輸出0。

題目大意:

給出0, 1, …, n-1 的乙個序列,要求通過兩兩交換的方式將其變為遞增序列,但是規定每次只能用0與其他數進行交換。求最小交換次數。

思路分析:

貪心策略:

步驟一:如果數字0當前在i號位,則找到i當前所在位置,二者交換。

步驟二:如果排序尚未完成,但0已經回到0號位,則將0與其他任意尚未歸位的數進行交換,繼續執行步驟一。

步驟三:直到數字串有序,0回到0號位,演算法結束。

**(未ac)

#include

#include

#include

using

namespace std;

const

int maxn =

100010

;int a[maxn]

;int index[maxn]

;int

main()

int ans =0;

if(index[0]

==0)}

}while

(index[0]

!=0)}

}}printf

("%d"

, ans)

;fclose

(stdin);

return0;

}

eg5. 《王道》p39 今年暑假不ac

思路分析:

這是一道典型的貪心演算法問題——最大不相交區間數。利用上述例1模板即可解決。

**

#include

#include

#include

using

namespace std;

const

int maxn =

105;

struct line

l[maxn]

;bool

cmp(line a, line b)

else

}int

main()

sort

(l, l+n, cmp)

;int ans =1;

int last_left = l[0]

.left;

for(

int i=

1; i

printf

("%d\n"

, ans);}

fclose

(stdin);

return0;

}

經典貪心演算法 貪心演算法概述

貪心演算法具有最優子問題結構,它的特點是 短視 每次選擇對當前局面最有利的決策,來一步步獲得最優解。我個人認為,貪心不是乙個具體的方法,而是一類方法,貪心演算法的關鍵不在於想到,而在於正確性的證明。要證明乙個貪心演算法是正確的,需要證明我們可以把乙個最優解逐步轉化為我們用貪心演算法所得到的解,而解不...

演算法 貪心演算法

把乙個複雜問題分解為一系列較為簡單的區域性最優選擇,每乙個選擇都是對當前解的乙個擴充套件,知道獲得問題的完整解。在解決問題的策略上目光短淺,只根據當前已有的資訊做出選擇,而且一旦做出了選擇,不管將來有什麼結果這個選擇都不會改變。換言之,貪心法並不是從整體最優考慮,它所做出的選擇只是在某種意義上的區域...

演算法 貪心演算法

集合覆蓋問題 旅行商問題等都屬於np完全問題,在數學領域上並沒有快速得到最優解的方案,非常適合用貪婪演算法。判斷方法 1.元素較少時,一般執行速度很快,但隨著元素數量增多,速度會變得非常慢 2.涉及到需要計算比較 所有的組合 情況的通常是np完全問題 3.無法分割成小問題,必須考慮各種可能的情況。這...