概述 貪心「反悔」策略 模型

2022-05-20 03:48:10 字數 2470 閱讀 2330

這種「反悔」操作真的很強

貪心操作中保證每一步都選取當前最優解,但通過某種轉換將一步更改操作轉為乙個可選取的物品。

又到了諾德縣的百姓孝敬夾克大老爺的日子,帶著數量不等的銅板的村民準時聚集到了村口。

夾克老爺是一位很"善良"的老爺,為了體現他的仁慈,有一套特別的收錢的技巧。

1、讓所有的村民排成一隊,然後首尾相接排成乙個圈。

2、選擇一位村民收下他的銅錢,然後放過他左右兩邊的村民。

3、讓上述三位村民離開隊伍,並讓左右兩邊的其他村民合攏起來繼續圍成乙個圈。

4、重複執行2、3直到村民全部離開。

夾克老爺的家丁早早的組織村民排成一隊並清點了村民人數和他們手裡的銅錢數量。

作為夾克老爺的首席師爺,你要負責按照夾克老爺的收錢技巧完成納貢的任務。

聰明的你當然知道夾克老爺並不像他表現出來的那樣仁慈,能否收到最多的錢財決定了你是否能夠繼續坐穩首席師爺的位置。

今年村民的人數是n,恰巧是3的倍數。

第一行1個整數n(3 <= n <= 10^5 - 1, n % 3 == 0)

第2 - n + 1行:每行1個數對應村民i手中的銅錢。(0 <= m[i] <= 10^9)

乙個整數,說明在夾克老爺的收錢規則下你最多能夠為夾克老爺搜刮到多少銅錢

662

3459

13

先來看乙個顯然很假的做法:將每乙個人重新賦乙個權值,為他自己的錢數減去他相鄰兩人的錢數和。然後每一次取所有的最大值,並且動態修改這個權值。

哈……這個果斷假的很……比如n=6,7 9 7 1 2 3就能夠卡掉。

那麼是什麼原因導致這個方法不正確呢?

結合上面那個就可以看出,這個新賦的權值代表的只是單個點在周圍兩個點之間相對的優劣。乙個只涉及相鄰元素的估價權值,還能指望它起什麼作用?……

但是貪心還是要貪的。取了元素有後效性,轉移又沒什麼辦法轉移,這輩子都不可能動態規劃的。

那麼首先,每次選取的肯定要是全域性裡較優的。但是歸根結底來說,是什麼原因導致了不能每一次都選最大的然後刪除其兩邊元素呢?是因為對於當前最優的操作,過一會有可能發現會有其他方法能夠使得以後更優。

看上去這是個貪心思路會遇到的通病,但是路並沒有被走絕。如果把「反悔」這一步也看做是乙個可以選取的物品,那麼之後不就會因為「反悔」在全域性更優而「改變歷史」嗎?(當然前提是獲得價值的操作與時間無關,並且題目的限制並不會因為反悔歷史操作而被違背)

當然「反悔」這個技巧也是要在特定情境下使用的。例如這題,我們可以發現幾個結論:

看上去不就是顯然結論嗎,但是可以由此推出這個問題的充要條件:選取$n/3$個互不相鄰的物品,並且允許將「反悔」作為物品形式選取。

一波酷炫操作之後,換成**形式就很好理解了……

1 #include2 typedef long

long

ll;3

const

int maxn = 200035;4

5ll n,a[maxn],tot,ans;

6ll pre[maxn],nxt[maxn];

7struct

cmp8

13};

14 std::priority_queue, cmp>q;

15bool

fbd[maxn];

1617

ll read()

1829

void

deletes(ll id)

3038

intmain()

3946

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

4755 printf("

%lld\n

",ans);

56return0;

57 }

farmer john 有太多的工作要做啊!!!!!!!!為了讓農場高效運轉,他必須靠他的工作賺錢,每項工作花乙個單位時間。 他的工作日從0時刻開始,有1000000000個單位時間(!)。在任一時刻,他都可以選擇編號1~n的n(1 <= n <= 100000)項工作中的任意一項工作來完成。 因為他在每個單位時間裡只能做乙個工作,而每項工作又有乙個截止日期,所以他很難有時間完成所有n個工作,雖然還是有可能。 對於第i個工作,有乙個截止時間d_i(1 <= d_i <= 1000000000),如果他可以完成這個工作,那麼他可以獲利p_i( 1<=p_i<=1000000000 ). 在給定的工作利潤和截止時間下,fj能夠獲得的利潤最大為多少呢?答案可能會超過32位整型。

第1行:乙個整數n. 第2~n+1行:第i+1行有兩個用空格分開的整數:d_i和p_i.

輸出一行,裡面有乙個整數,表示最大獲利值。

32 10

1 51 7

17第1個單位時間完成第3個工作(1,7),然後在第2個單位時間完成第1個工作(2,10)以達到最大利潤

其實還有1029: [jsoi2007]建築搶修這題也是一樣,運用題目性質和堆實現了「反悔」操作。

參見end

種樹 反悔操作 貪心

本人水平有限,題解不到為處,請多多諒解 本蒟蒻謝謝大家 題目 傳送門 具體的解析大佬部落格裡有 推薦 部落格 我這裡是來講下如何 實現的 我們用pair來實現堆優化,first代表權值,second代表權值位置 1 void del int x 以上 如何理解呢?先看一幅圖 我們先算4個點 如果依照...

反悔自動機與反悔堆 有關貪心的反悔操作

其實兩個東西都是堆。區別只不過乙個是利用差值等巧妙設計等效權值,另乙個則單純進行判斷。反悔自動機 名字是我自己起的 貪心是不能反悔的。因為它就是選擇當前的最優解。但是如果當前最優解不是全域性最優解怎麼辦?我們可以設計一種反悔的方法,並且和貪心的手法結合。使得貪心隨便選擇,都可以達到正解。姑且叫反悔自...

帶 反悔 的貪心 超市

題面 超市裡有n件商品,每個商品都有利潤p i pi 和過期時間d i d i,每天只能賣一件商品,過期商品 即當天d i 0 di 0 不能再賣。求合理安排每天賣的商品的情況下,可以得到的最大收益是多少。第一眼看過去,呀,我應該先選利潤大的。但是因為選了利潤大的,錯失了一些利潤還行的,而且就算 選...