本題說每選乙個坑,它的左右兩個坑都不能選了,可是我們沒有辦法確定我們選某個坑一定是最優解,怎麼辦呢?
我們設定乙個反悔機制,每當選乙個坑,就新設定乙個點,使這個點的值為這個坑兩邊的和減去當前坑的差.
為什麼這樣做是對的呢?
感性想一下,如果再後面的選坑過程中,我們選到了這個新設定的點,說明我們選上文的那個坑不是最優解,而它的兩邊更優,那麼答案加上新設定的點的值,其實就等價於選那個坑的兩邊.
我們將所有值扔進乙個大根堆中,一直選,直到堆頂為負數,或選夠了k個坑為止.
當然了,我們每選乙個坑就用乙個bool變數標記它的左右兩個坑不可選.
1 #include2 #include3 #include4 #include5 #include67using
namespace
std;89
int n,k,l[500002],r[500002
];10
long
long ans,c[500002
];11
bool p[500002
];12
struct
kkk
17 }e[500002
];18 priority_queuea;
1920
intmain()
31 r[0] = 1
;32 l[n] = n + 1;33
for(int i = 1;i <= k; i++)
40kkk t;
41 t =a.top();
42a.pop();
43 ans +=t.v;
44 p[l[t.id]] = p[r[t.id]] = 0
;45 c[t.id] = 0 - c[t.id] + c[l[t.id]] +c[r[t.id]];
46 t.v =c[t.id];
47 l[t.id] =l[l[t.id]];
48 r[t.id] =r[r[t.id]];
49 l[r[t.id]] =t.id;
50 r[l[t.id]] =t.id;
51a.push(t);52}
53 printf("
%lld
",ans);
5455
return0;
56 }
洛谷 P1484 種樹 思維 堆
洛谷 p1484 種樹 思維 堆 很容易想到用乙個大根堆來儲存每個位置的獲利,但我們不能每次都取出根元素後,將其兩邊的元素標記位不可選擇,因為這個根元素兩邊的元素之和很可能大於這個根元素,這時我們選擇的就不是根元素,而是兩邊的元素,所以我們要有乙個反悔選擇的機會,我們在選擇根元素的時候,在總獲利中加...
洛谷P1484種樹(堆 較難貪心)
題意很清晰很好懂,做起來就難了。資料範圍小的化可搜尋可dp,but資料這麼大是不可能的了,較難貪心 a i 或左加右只選乙個最大的 堆 每次取出最大的 1 include 2 include 3 include 4 using namespace std 5 typedef long long ll...
後悔貪心法 種樹(洛谷 P1484)
題目描述 cyrcyr今天在種樹,他在一條直線上挖了n個坑。這n個坑都可以種樹,但為了保證每一棵樹都有充足的養料,cyrcyr不會在相鄰的兩個坑中種樹。而且由於cyrcyr的樹種不夠,他至多會種k棵樹。假設cyrcyr有某種神能力,能預知自己在某個坑種樹的獲利會是多少 可能為負 請你幫助他計算出他的...