洛谷 P1417烹調方案

2022-01-19 04:11:14 字數 1570 閱讀 4788

洛谷 p1417烹調方案

由於你的幫助,火星只遭受了最小的損失。但gw懶得重建家園了,就造了一艘飛船飛向遙遠的earth星。不過飛船飛到一半,gw發現了乙個很嚴重的問題:肚子餓了~

gw還是會做飯的,於是拿出了儲藏的食物準備填飽肚子。gw希望能在t時間內做出最美味的食物,但是這些食物美味程度的計算方式比較奇葩,於是絕望的gw只好求助於你了。

一共有n件食材,每件食材有三個屬性,ai,bi和ci,如果在t時刻完成第i樣食材則得到ai-t*bi的美味指數,用第i件食材做飯要花去ci的時間。

眾所周知,gw的廚藝不怎麼樣,所以他需要你設計烹調方案使得美味指數最大

第一行是兩個正整數t和n,表示到達地球所需時間和食材個數。

下面一行n個整數,ai

下面一行n個整數,bi

下面一行n個整數,ci

輸出最大美味指數

輸入 #1

74 1

5022

47

輸出 #1

408
【資料範圍】

對於40%的資料1<=n<=10

對於100%的資料1<=n<=50

所有數字均小於100,000

【題目**】

tinylic改編

思路: 這題有點類似於揹包問題取最大價值的型別。但不同點是本題中食物的美味程度與時間相關,是會一直變化的;而揹包問題中物品的價值是固定的。那麼可不可以通過某些特定的表示式來計算食材相對固定的價值呢?單看乙份食材是沒有結論的,那麼我們可以設定x、y兩份相鄰的食材(暫時只考慮這兩份食材,它倆的製作順序是相鄰的,但是誰先誰後不確定),該做這兩份食材時時間已經過去了t。食材的a、b、c儲存在結構體陣列q中。

可以有先做x的美味程度sum1=q[x].a-(t+q[x].c)*q[x].b+q[y].a-(t+q[x].c+q[y].c)*q[y].b

先做y的美味程度sum2=q[y].a-(t+q[y].c)*q[y].b+q[x].a-(t+q[y].c+q[x].c)*q[x].b

如果令sum1>sum2則化簡得:q[x].c*q[y].b然後可是過載下結構體陣列的cmp函式,進行排序,根據這個排序結果,解決問題。因為題目中有時間限制,所以狀態轉移關係應該與時間有關。設已用時間j,i為當前遍歷到的食材編號,則有狀態轉移方程為

if(dp[j]>0&&j+q[i].c<=t)

**如下:

#include #define ll long long

using namespace std;

const int maxn=51;

const int maxs=100001;

ll dp[maxs];

struct nodeq[maxn];

bool cmp(node a,node b)

int main()

} }for (int i = 0; i <= t; i++)sum = max(sum, dp[i]);//遍歷dp陣列,得到最大的美味程度

cout << sum << endl;

return 0;

}

洛谷P1417 烹調方案

由於你的幫助,火星只遭受了最小的損失。但gw懶得重建家園了,就造了一艘飛船飛向遙遠的earth星。不過飛船飛到一半,gw發現了乙個很嚴重的問題 肚子餓了 gw還是會做飯的,於是拿出了儲藏的食物準備填飽肚子。gw希望能在t時間內做出最美味的食物,但是這些食物美味程度的計算方式比較奇葩,於是絕望的gw只...

洛谷P1417 烹調方案

這道題不同於普通的01揹包,不同的先選擇的做菜策略會對之後產生不同的影響,即不滿足 無後效性 但是,考慮一種選擇策略,假設有兩個先後做的菜i和j,交換他們的順序會產生什麼影響呢?假設ij之前的時間為t 先i後j a i t c i b i a j t c i c j b j 先j後i a j t c...

洛谷 P1417烹調方案

一共有n件食材,每件食材有三個屬性,ai,bi和ci,如果在t時刻完成第i樣食材則得到ai t bi的美味指數,用第i件食材做飯要花去ci的時間。求最大美味指數之和。顯然的0 1揹包,但是,它與平常的0 1揹包不同之處在於 平常的物品不會因為時間的延續而使價值貶值,也就是說,先放a 先放b是無所謂的...