Springboards 貪心,類單調棧

2021-10-07 21:03:06 字數 1177 閱讀 4302

進不來的

你要從(1,1)走到(n,n),你每次可以往右或往上走一步,現在有一些跳板,當你走到左下角的時候,你就會跳到右上角,並且不算步數,問你需要走最少多少步。

我感覺這道題cdq分治可以做,但是寫到一半的時候忘掉了。。。

我用ans陣列表示到第i個跳板可以減掉的最長步數。

首先為了保持每個點位置的一致性,需要將跳板的起點和終點拆開進行分步運算。

那麼對於每個跳板的起始位置,肯定是找到它左下角的最大答案進行轉移,那麼我們就需要按照x軸進行排序,然後查詢的話可以用線段樹,當然也可以用別的方法。

對於跳板的終點位置,我用乙個類似單調棧的東西,也就是y從小到大的時候,值是從大到小的,這樣查詢的時候,它下面的第乙個存在的位置就是最優解。比如說我現在有這樣乙個序列:

表示y=1的時候答案為-1,…

然後新進來乙個數,在y=2的時候,答案最小是-6

那麼此時就要把3,5排出去,因為他們更劣。

用map一直維護這個東西就好了。

#include

using namespace std;

const

int n=

1e5+5;

int ans[n]

;struct node

}e[n*2]

;map<

int,

int>mp;

intmain()

sort

(e+1

,e+1

+m*2);

map<

int,

int>

::iterator it;

mp[0]

=0;for

(int i=

1;i<=m*

2;i++

)else

} it=mp.

end();

it--

;printf

("%d\n"

,n*2

+it->second)

;return0;

}

貪心類演算法總結

輸入描述 有多組測試資料。第一行輸入兩個非負整數x 和n。接下來n 行,每行輸入兩個整數,分別為mi 和wi。所有資料都不大於1000。x 和n 都為 1 時程式結束。輸出描述 請輸出小明最多能喝到多少毫公升的飲料,結果保留三位小數。輸入樣例 233 6 6 123 66 32 23 66 66 1...

活動安排問題(區間類貪心)

題意 設有n個活動的集合e 其中,每個活動都要求使用同一資源,如演講會場等,而在同一時間內只有乙個活動能使用這一資源。每個活動i都有乙個要求使用該資源的起始時間si和乙個結束時間fi,且si fi。如果選擇了活動i,則它在半開時間區間 si,fi 內占用資源。若區間 si,fi 與區間 sj,fj ...

一類貪心題亂編

ps 明天就要考數學了,好慌 我們考慮一類貪心題,它們常常是某些物品帶有一定價值,若干天,每次能選一定量,但是隨著一段時間可決策集合越來越窄.對於這類題,乙個比較通用的想法就是倒過來考慮,因為如果倒過來考慮,就變成決策集合單調不減,於是往往可以直接用堆之類的資料結構進行貪心.類似一種反悔貪心?常常體...