種樹 反悔操作 貪心

2022-05-07 04:00:12 字數 2005 閱讀 1552

本人水平有限,題解不到為處,請多多諒解

本蒟蒻謝謝大家**

題目:傳送門

具體的解析大佬部落格裡有

推薦:部落格

我這裡是來講下如何**實現的

我們用pair來實現堆優化,first代表權值,second代表權值位置

1

void del(int

x)

以上**如何理解呢?

先看一幅圖:

我們先算4個點

如果依照最基本的貪心策略(即取最大值)

應該是這樣:

但是我們發現這並不是最優解,ans==10,明顯小於 ans==16

這時就要進行反悔操作,即贖買 ,算差值

記錄我們取的當前節點的最大值與其左右兩個節點之和的差值 (來方便贖買) 即反悔操作

可知:差值為7 (8+8-9=7)

這時我們把7放到原先9的位置上

我們發現8在我們取9的時候被打上了標記,不能取

即:

1 flag[x]=true;
對於不能取的點,我們要讓其退出堆內,即:

1

while

(flag[q.top().second])

這時堆裡的最大值為7,就取出7來更新ans

所以這兩句話的意思是:

如果當m的兩倍大於n的話,顯然是無法種完m的(隔板插空),所以直接輸出

error!

code:

1 #include2

#pragma gcc optimize(3)

3#define int long long

4const

int n=1e6+10;5

using

namespace

std;

6bool

flag[n];

7int

n,m,ans,node[n],pre[n],nxt[n];

8 priority_queueint,int> >q;

9 inline int

read()

12while(isdigit(ch))

13return x*f;14}

15void del(int

x)20

void

greedy()

24int a=q.top().second;

25q.pop();

26 ans+=node[a];

27 node[a]=node[nxt[a]]+node[pre[a]]-node[a];

28del(pre[a]);

29del(nxt[a]);

30q.push(make_pair(node[a],a));31}

32signed main()

3341 pre[1]=n;

42 nxt[n]=1;43

if (m*2>n)

47for(int i=1;i<=m;i++)

50 printf("

%lld

",ans);

51return0;

52 }

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

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

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

這種 反悔 操作真的很強 貪心操作中保證每一步都選取當前最優解,但通過某種轉換將一步更改操作轉為乙個可選取的物品。又到了諾德縣的百姓孝敬夾克大老爺的日子,帶著數量不等的銅板的村民準時聚集到了村口。夾克老爺是一位很 善良 的老爺,為了體現他的仁慈,有一套特別的收錢的技巧。1 讓所有的村民排成一隊,然後...

帶 反悔 的貪心 超市

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