一類貪心題亂編

2022-06-03 18:48:09 字數 2027 閱讀 4949

ps:明天就要考數學了,好慌

我們考慮一類貪心題,它們常常是某些物品帶有一定價值,若干天,每次能選一定量,但是隨著一段時間可決策集合越來越窄.

對於這類題,乙個比較通用的想法就是倒過來考慮,因為如果倒過來考慮,就變成決策集合單調不減,於是往往可以直接用堆之類的資料結構進行貪心.

類似一種反悔貪心?常常體現為貪心實質是在模擬費用流(然而我基本不會網路流)

例題1,[noi2017]蔬菜

題意:太長了就不說了,自己看吧,大致就是上面的模型

發現正著做十分難做,考慮倒著貪心.

因為第p-1天答案顯然是第p天減掉最劣的決策(因為p-1對於p來說決策集合單調不減,所以p能選的所有p-1都能選,所以可以隨便刪)

於是我們只要求出第p天的值,(p = max($p_$)),然後就可以倒推1~p-1

考慮倒著推怎麼做.我們發現題目一堆奇奇怪怪的限制在倒推中突然就有了意義,如果某堆食物從某天開始就不變質了,就把它加進去(又是因為決策集合單調不減,對於倒著推來說,如果當前不變質,之後就不會再變質了)

於是可以直接塞堆裡,貪心

/*[noi2017]蔬菜*/

#includeusing namespace std;

#define ll long long

int read()

struct node

bool operator <(const node &a)const

};const int n = 1e5 + 10;

priority_queueq;

int a[n],s[n],c[n],x[n],n,m,k;

int p = 1e5;

vectord[n];/*第i天會有哪些元素加進來*/

int sel[n];

bool vis[n];

node st[n];int top;

ll ans[n];ll ss;

#define pb push_back

int main()

for(int i = p; i; --i)

for(int j = m; j && !q.empty();)

else

} while(top) q.push(st[top]),top--;

} while(q.size()) q.pop();

memset(vis,0,sizeof(vis));

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

for(int i = p - 1; i; --i)

}// return 0;

while(k--)

return 0;

}

upd:還有從費用流角度的理解,先咕著

例題2.[cf505e]

首先肯定是要二分的,設當前二分的值為h,所以就變成了最大值能否不超過h

有乙個極度鬼畜的max($h_$ - p,0)

我們依然考慮倒著做,考慮設所有值初始位置都是h,每時刻-=a[i],任意時刻都不能<0,你可以給它加上p,是否存在一種方案,使得最終位置 >=  h[i]

只要按變成<0的順序,優先+那些會先<0的,貪心地+p最後再檢查是否全部合法就可以了.

/*cf505e mr. kitayuta vs. bamboos*/

#includeusing namespace std;

#define ll long long

int read()

const int n = 1e5 + 10;

ll a[n],h[n],n,m,k,p;

struct num

num (int _a = 0,ll _b = 0,int _c = 0,int _d = 0)

};priority_queueq;

bool check(ll x)

} if(q.empty()) return 1;return 0;

}int main()

else l = mid + 1;

} cout

}

Leetcode Sum一類題目

leetcode裡有一類這樣的題目,給定乙個陣列和乙個target值,尋找陣列中的幾個數相加等於target值。1 two sum,尋找陣列中兩個數相加等於target值 2 three sum,尋找陣列中三個數相加等於target值 3 four sum,尋找陣列中四個數相加等於target值 注...

物件導向(一) 類

class class nameobject name 乙個或者幾個物件的標識 class crectanglerect 是crectangle型別的物件的名稱 crectangle 和 rect的關係就像 int 和變數a的物件一樣 int 型別名 a 物件名,變數 如果物件需要呼叫類裡面的函式,...

一 類與物件

物件的儲存細節 程式啟動,先把程式載入到 區。系統自動建立乙個類物件,載入類中的物件方法列表。當通過乙個類建立物件時,先在堆中開闢一塊儲存空間給物件p,再初始化物件的各屬性為0,最後返回乙個位址儲存到棧中 區域性變數接收 物件的第0個屬性是系統建立的isa指標,指向建立該物件的類。類方法只能類呼叫,...