mark 在無意中了解到了 elf 的身世。在和 james 商量過之後,好心的他們 打算送 elf 返回故鄉。然而,去往 gliese 的飛船票價高的驚人,他們暫時還付 不起這筆費用。經過一番考慮,mark 打算去額外做一些工作來獲得收入。 經過一番調查,mark 發現有 n 個工作可以做。做第 i 件工作所需要的時間為 di,同時也需要乙個能力值 ci 才可以去做,每件工作都可以在任意時間開 始,也可以做任意多次。所有的工作給付的報酬都是一致的。同時,有 s 個課 程可以參加,我們認為今天是第 0 天,第 i 個課程在第 mi 天開始,持續時間 為 li 天,課程結束之後能力值會變為 ai。現在 mark 的能力值為 1。mark 只 能做工作到第 t 天(因為那是飛船起飛的日子)。
輸入格式:
第一行包含三個空格分隔的整數 t,s,n。 之後 s 行,每行三個整數 m,l,a,描述乙個課程。 之後 n 行,每行兩個整數 c,d,描述一件工作。
輸出格式:
乙個整數,表示 mark 最多可以做多少件工作。
輸入樣例
輸出樣例
10 1 2
3 2 5
4 11 3
第 0 天至第 2 天做第二件工作 1 次,第 3 天至第 4 天參加課程,能力值變為 5。然後第 5 天至第 9 天做第一件工作 5 次。第 10 天 mark 不可以繼續做工作了。所以 mark 最多做 6 次工作。
對於 20% 的資料,t,s,n≤10。
對於 50% 的資料,t,n≤1000。
對於 100% 的資料,s≤100,m,l≤10000,a≤100。n≤10000,c≤100, d≤10000,t≤10000。
根據題目,我們嘗試用動態規劃來解決這道題。
狀態:f[i][j]第i天時能力值為j的最大工作量
轉移:
對於上面的轉移,我們有一下的一些優化:
由此我們的狀態轉移方程就變成了這樣:
初始值:
這是這道題最神奇的地方了,他的初始值分為兩部分:
f[0][1] = 0表示的是第0天時能力值為1,且無法工作。
對於其餘的f則要賦初值為負無窮。
為什麼呢?因為對於這道題中有很多的狀態是無效狀態,對於無效狀態f[i][j]是無法在第 i 天之前得到 j 的能力值卻在 i 天的時候有用 j 的能力值去做了工作(即對答案產生了貢獻),比如說在輸入樣例中,f[2][4] , f[2][5]就是無效狀態。我們對比分析一下有效狀態和無效狀態之間的關係,我們發現有效狀態只會由有效狀態轉移得到,那麼我們的問題就是找到最開始的有效狀態是什麼了,根據題目中的「現在 mark 的能力值為 1」和「我們認為今天是第 0 天」我們可以確定最初的有效狀態是f[0][1] = 0。又因為我們的g陣列要求當前階段的所有狀態的最大值(包括無效狀態),所以我們要消除掉所有無效狀態對答案的影響,注意到我們的有效狀態只會通過工作這種轉移方式轉移到無效狀態,而這種轉移方式對答案的改變每次只+1,而其餘的轉移都是取min和取max,所以我們就可以像上面那樣賦初值。
#include usingnamespace
std;
int ke[10005][105], g[10005
];int f[10005][105
];int po[10005
];int
main()
for(int i = 1; i <= n; ++i)
for(int i = 2; i <= maxc; ++i)
po[i] = min(po[i], po[i - 1
]); f[
0][1] = 0
;
for(int i = 1; i <= t; ++i)
}printf(
"%lld\n
", g[t]);
}
2007 4 24工作計畫
成果 頁面完成 logic 標籤 struts 提供3 個風格的邏輯標籤 取值標籤,控制流標籤,以及反覆標籤。struts 邏輯標籤的 3 種型別 標籤目的 取值標籤 測試值是否相等,小於,大於,空 空白或者 null 或者是否存在 控制流標籤 或者重定向請求 重複標籤 通過某些集合型別進行迭代 s...
如何制定工作計畫
工作計畫是什麼 東東 查閱n多資料後發現,它不是我們所認識的那個東東,資料上一致認為它是 對即將開展的工作的設想和安排,如提出任務 指標 完成時間和步驟方法等。1.明確工作步驟,提高工作效率,避免遺漏工作。2.減少盲目性工作,不做無用功,節省時間。3.提高工作質量,使工作按計畫有條不紊進行。4.主動...
2023年工作計畫
1 總結自己一天任務的完成情況 最好的方式是寫工作日誌,把自己今天完成了什麼事情,遇見了什麼問題都記錄下來,日後翻看好處多多 2 考慮自己明天應該做的主要工作 把明天要做的事情列出來,並按照優先順序排列,第二天應該把自己效率最高的時間分配給最重要的工作 3 考慮自己一天工作中失誤的地方,並想出避免下...