本人水平有限,題解不到為處,請多多諒解
本蒟蒻謝謝大家**
題目:傳送門
具體的解析大佬部落格裡有
推薦:部落格
我這裡是來講下如何**實現的
我們用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這時堆裡的最大值為7,就取出7來更新answhile
(flag[q.top().second])
所以這兩句話的意思是:
如果當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 不能再賣。求合理安排每天賣的商品的情況下,可以得到的最大收益是多少。第一眼看過去,呀,我應該先選利潤大的。但是因為選了利潤大的,錯失了一些利潤還行的,而且就算 選...