區間貪心問題小結(區間選點,區間覆蓋,區間選取)

2022-03-14 05:22:32 字數 2696 閱讀 4587

貪心演算法

思想:什麼是貪心演算法,什麼算得上是貪心

貪心演算法(又稱貪婪演算法)是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,只做出在某種意義上的區域性最優解。貪心演算法不是對所有問題都能得到整體最優解,關鍵是貪心策略的選擇,選擇的貪心策略必須具備無後效性,即某個狀態以前的過程不會影響以後的狀態,只與當前狀態有關。

例題:最少硬幣問題有1、2、5、10、20、50、100七種面值的硬幣,要支付指定的金額,問怎麼支付所用的硬幣個數最少

策略:緊著最大分值換。

最大斜率問題,給出n個點的座標(笛卡爾座標) 求(a[i]-a[j])/(i-j)最大

策略:相鄰的座標中找到最大斜率

區間選取(會場安排問題),給乙個大區間l,r然後給你n個區間,最最多多少個區間沒有重複部分

例子:

學校的小禮堂每天都會有許多活動,有時間這些活動的計畫時間會發生衝突,需要選擇出一些活動進行舉辦。小劉的工作就是安排學校小禮堂的活動,每個時間最多安排乙個活動。現在小劉有一些活動計畫的時間表,他想盡可能的安排更多的活動,請問他該如何安排。

輸入:

第一行是乙個整型數m(m<100)表示共有m組測試資料。

每組測試資料的第一行是乙個整數n(1輸出:

對於每一組輸入,輸出最多能夠安排的活動數量。

那麼第乙個時,肯定選此時能選的結束時間最早的,選其他的話給後面留的時間都比前者小,所以咱們選的第乙個肯定沒錯,就是此時能選的結束時間最早的,然後選第二個時,也是選可選時間中結束最早的,這樣保證有其最優解,歸納起來激就是,每個根據當前可用時間,選取乙個結束時間最早的,做為下乙個會場的安排,

區間選點問題,n個閉區間[ai,bi],讓他取盡量少的點,使得每個閉區間內至少有乙個點。

輸入:n個閉區間,

輸出:最少用幾個點,把每個區間都包含乙個點

策略:讓這個點出現在乙個沒有點的區間上,盡可能覆蓋多的區間的地方**(效果:按結束處排序)**

首先為了將最左邊的乙個區間覆蓋,(按結束排序即可)那麼第乙個點必須在第乙個區間上,那麼在區間上哪呢?為了讓這個點讓更多的區間的區間碰到,讓這個點最靠右,這樣的話能保證這個點覆蓋的地方最多,然後一直往後遍歷,直到乙個區間不在這個點上時,為了讓這個區間被覆蓋,必須在從這個區間上找一點,(問題變為了前者) 每次乙個點可以解決乙個區間或者若干個區間,這遍歷完所有區間即可

鏈結

**:

#include#includeusing namespace std;

const int maxn=10010;

struct nodenode[maxn];

bool cmp(node a,node b)

}printf("%d\n",ans);}}

區間完全覆蓋問題問題描述:給定乙個長度為m的區間(全部閉合),再給出n條線段的起點和終點(注意這裡是閉區間),求最少使用多少條線段可以將整個區間完全覆蓋

將所有區間化作此區間的區間,剪輯一下(沒用的區間刪除)

策略:在能連線區間左邊的情況下,找到向右邊擴充套件最長的位置。(效果:按開頭排序,開頭一樣,右邊最長的靠前)

為了連線到這個需要被覆蓋區間的左邊,選乙個左端點最靠前的區間,如果左端點相同讓右端點大的排在前面

然後向右掃瞄區間…,如何找下乙個需要安置的區間呢,即直到找到與上乙個區間沒有連線的地方,這時候必須找乙個區間來來作為乙個連線,因為前面區間都沒有斷開,所以在前面掃瞄過的區間找到乙個結束處最大的區間作為連線就行,記下這個能擴充套件到右邊的最大位置(其實這個過程是找邊的過程)。如果這個最大位置都不能連著,證明這個區間不能被完全覆蓋!即不存在解。

else//如果不能補}}

if(flag)

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

else

printf("0\n");}}

區間問題 區間選點 區間問題 貪心

玄學的貪心問題,一般全憑直覺。貪心問題沒有固定討論,沒有模板,見多了就好了,證明想法的正確性是很困難的,大多採用反證法。905.區間選點 貪心思路 證明 時間複雜度 o n logn o nlogn o nlog n include include using namespace std const...

貪心 區間選點問題

數軸上有 n 個閉區間 a i,b i 取盡量少的點,使得每個區間內都至少有乙個點 不同區間內含的點可以是同乙個 第一行1個整數n n 100 第2 n 1行,每行兩個整數a,b a,b 100 乙個整數,代表選點的數目 input 21546 output 1input 3132546 outpu...

貪心 區間選點問題

主要採用的就是貪心的思想,首先以每一段的右端點為判斷依據,通過重定義排序規則,使得排序規則是以右端點的大小來排序,然後通過遍歷整個陣列,如果左端點小於當前指定標誌位端點,說明這段是在點的內部範圍內的,就忽略,如果不是在當前指定標誌位端點,那麼就記錄端點數加一,同時更新標誌位端點為當前右端點。incl...