乙個OIer的做題筆記

2022-07-02 09:15:09 字數 1436 閱讀 8967

為了督查自己,特意開坑記錄。

開始看這題時沒什麼思路,但觀察了一下,發現這道題滿足無後效性,於是就想出了下面的貪心方案。

貪心方案:每天只要用前一天剩下來的錢來做當天的最優方案,這樣這題就像完全揹包問題了。

如何證明該想法的正確性(如果認為之前做的決策放到現在不是最優的)?

比如 第1天

買了乙個 物品a

,用了10元,第2天

賣了 物品a

,獲得了20元,但 第3天

物品a**為100元,這個時候 第2天

如果不賣等到 第3天

買會更賺(那是不是之前的決策不優了呢?不,對於 第1天

該決策是最優的),我們可以在 第2天

時再將 物品a

買回來,到第三天再賣,這樣就相當於將 物品a

在 第1天

買 第3天

賣。所以每天只要考慮當天和明天的關係就行了,不需要考慮之前那些天。

f[k] 表示當天有 k 元的最優方案,每次 f[k] 清空進入下一天.

for (int i=1; i<=t; i++)//迴圈天數

}ans+=f[ans];//答案加上當天賺的錢

}

看完題目認為只要按照字典序從小到大跑一邊拓撲,但這個貪心想法是萎的,

如樣例中,有5道菜,5要在2前做,4要在3前做。如果按照這個想法來做結果是1,4,3,5,2.

但這樣不能滿足2盡量在3前做這個條件,正確答案應該是1,5,2,4,3.

所以要換一種貪心想法:從後往前做,在滿足限制下,越後的字典序越大。

為了實現這種想法,我們要把所給的限制換種方式表達。

如樣例就為,有5道菜,2要在5後做,3要在4後做。因為3字典序大於2,所以3是最後一道菜,接著5比2字典序大,所以倒數第2個是5,接著2比1大,5比1大,接著第1道菜為1.從前往後答案就為1,5,2,4,3.

再證明一下確性:因為從後往前選字典序大 與 從前往後選字典序小的一樣能滿足所給限制,但這樣還能考慮到 字典序小的在字典序大的後一直沒被選到而導致不符合(i盡可能在i+1前)這條限制 的情況。

有了這個貪心方案,就可以反向建邊,跑一邊拓撲排序,再反序輸出答案。

注:當拓撲完,存到的點數如果小於n,則為無解情況。

思路:先考慮兩兩之間的關係,推出的關係能適用於所有(因為具有傳遞性)

乙個菜鳥的做題之路 階乘問題

1.cpp 此檔案包含 main 函式。程式執行將在此處開始並結束。include pch.h include include include int main printf d n s printf the time is 6f n double clock clocks per sec retu...

std io的乙個筆記

之前一直用fread和fwrite,但是一直沒有認真看過manual page。這次看apue才發現,自己之前有個誤解。std io 操作 size t fwrite const void buf,size t size,size t count,file fp if fwrite succeeds...

乙個記錄筆記的方法

康奈爾筆記系統是沃爾特 鮑克等人發明的 5r筆記技術,旨在為幫助學生有效地做筆記。康奈爾筆記系統把一頁紙分成了三部分 左邊記錄右邊線索和下方總結。格式很簡單,將筆記的一頁分為雙欄 左邊佔1 3,右邊佔2 3 右邊比較大的空間用來在上課時快速記錄筆記,而左邊比較小的空間則讓你課後立即在此歸納重點 補充...