後悔貪心法 種樹(洛谷 P1484)

2021-09-28 12:20:24 字數 1015 閱讀 7878

題目描述

cyrcyr今天在種樹,他在一條直線上挖了n個坑。這n個坑都可以種樹,但為了保證每一棵樹都有充足的養料,cyrcyr不會在相鄰的兩個坑中種樹。而且由於cyrcyr的樹種不夠,他至多會種k棵樹。假設cyrcyr有某種神能力,能預知自己在某個坑種樹的獲利會是多少(可能為負),請你幫助他計算出他的最大獲利。

輸入格式

第一行,兩個正整數n,k。

第二行,n個正整數,第i個數表示在直線上從左往右數第i個坑種樹的獲利。

輸出格式

輸出1個數,表示cyrcyr種樹的最大獲利。

輸入 #1

6 3

100 1 -1 100 1 -1

輸出 #1

貪心+優先佇列;

這種貪心題配上優先佇列,多多少少是考一定的思維的,有時候會非常難想;

這道題是可以反悔的貪心,跟這道題有點相似,具體貪心證明洛谷題解上有,不多說了;反正這種題目都大概是先把最多的貪掉,然後記錄差值,看是否可以進行反悔操作;

**:

#include

#define ll long long

#define pa pair

using

namespace std;

struct nodean[

500100];

int l[

500100

],r[

500100

],vis[

500100];

priority_queue< pa >qu;

ll sum;

intmain()

while

(k--

) cout

}

洛谷 P1484 種樹

本題說每選乙個坑,它的左右兩個坑都不能選了,可是我們沒有辦法確定我們選某個坑一定是最優解,怎麼辦呢?我們設定乙個反悔機制,每當選乙個坑,就新設定乙個點,使這個點的值為這個坑兩邊的和減去當前坑的差.為什麼這樣做是對的呢?感性想一下,如果再後面的選坑過程中,我們選到了這個新設定的點,說明我們選上文的那個...

洛谷P1484種樹(堆 較難貪心)

題意很清晰很好懂,做起來就難了。資料範圍小的化可搜尋可dp,but資料這麼大是不可能的了,較難貪心 a i 或左加右只選乙個最大的 堆 每次取出最大的 1 include 2 include 3 include 4 using namespace std 5 typedef long long ll...

洛谷 P1484 種樹 思維 堆

洛谷 p1484 種樹 思維 堆 很容易想到用乙個大根堆來儲存每個位置的獲利,但我們不能每次都取出根元素後,將其兩邊的元素標記位不可選擇,因為這個根元素兩邊的元素之和很可能大於這個根元素,這時我們選擇的就不是根元素,而是兩邊的元素,所以我們要有乙個反悔選擇的機會,我們在選擇根元素的時候,在總獲利中加...