時間限制:c/c++
1秒,其他語言2秒
空間限制:c/c++
32768k,其他語言65536k
64bit io format:
%lld
小明是個大廚,早上起來他開始一天的工作。他所在的餐廳每天早上都會買好n件食材(每種食材的數量可以視為無限),小明從到達餐廳開始就連續工作t時間。每道菜餚的製作需要特定的一種食材以及一段時間,但是食材一旦放久就不新鮮了,菜的美味值會降低。第i道菜餚有三個屬性ai,bi,ci,ai是該菜餚的美味值,bi是該菜餚所選食材不新鮮的速率,如果在第t時刻完成第i道菜則美味值為:ai-t*bi,完成這道菜需要ci的時間。小明希望在這t時間內能做出菜餚使得總美味值最大,所以小明求助於你。輸入描述:
第1行輸入三個整數n,m,t,分別代表食材種類,菜餚種類和工作時間。 第2行輸入n個整數bi,代表第i個食材不新鮮的速率。示例1第3-n+2行,每行輸入三個整數j,ai,ci,分別代表第i道菜餚需要的食材編號,菜餚的美味值,完成時間。
資料保證:0輸出描述:
輸出一行,乙個整數,表示最大總美味值。
輸入複製
1174
2150247
輸出
複製
408
示例2
輸入複製
2210
21110082
503
輸出
複製
84
備註:
最大總美味值可能為負。
看完題第一反應是比價效比(最近剛做了乙個題),就是製造出乙個評比標準,然後排序,進行美味值計算
兩個菜餚x和y先後製作看看美味值
先x後y:a[x]−(sum+t[x])∗b[x]+a[y]−(sum+t[x]+t[y])∗b[y](1)
先y後x:a[y]−(sum+t[y])∗b[y]+a[x]−(sum+t[x]+t[y])∗b[x](2)
sum是之前所做的菜所用的時間
我們要知道哪個順序做最佳,兩者比較,假如說先x後y最佳,式子1>式子2,經過化簡可以得到tx/bxx * by
< ty* bx
然後我們可以用dp來做,01揹包,dp[i]表示各個時間t完美味值情況
我用的結構體,edge
a美味值,b不新鮮速率,c時間,j順序
dp[j]=max(dp[j],dp[j-edge[i].c]+edge[i].a-j*edge[edge[i].j].b);
dp[j-edge[i].c]+edge[i].a-jedge[edge[i].j].b中
第乙個dp表示在做這個菜之前的時間內所得到的美味值
edge[i].a表示食材起初的美味值
jedge[edge[i].j].b表示當前菜所要消耗的新鮮值
後兩者相減為做這個菜所得到的美味值
#include
typedef
long
long ll;
using
namespace std;
const
int inf=
-1e9-2
;const
int maxn=
2e5+8;
ll sum=inf;
//美味值可能是負值
int n,m,t;
ll dp[maxn]
;struct nodeedge[maxn]
;//bool max(int x,int y)
//bool
cmp(node x,node y)
intmain()
for(
int i=
1;i<=t;i++
)dp[i]
=inf;
//dp賦最小值
for(
int i=
1;i<=m;i++
)for
(int j=t;j>=edge[i]
.c;j--
)for
(int i=
1;i<=t;i++
)sum=
max(sum,dp[i]);
cout
}/*2 2 10
2 11 100 8
2 50 3
*//*
100 2 8
50 1 3
*/
牛客網 每日一題 4月14日題目精講 Xorto
傳送時間限制 c c 2秒,其他語言4秒 空間限制 c c 32768k,其他語言65536k 64bit io format lld 給定乙個長度為n的整數陣列,問有多少對互不重疊的非空區間,使得兩個區間內的數的異或和為0。輸入描述 第一行乙個數n表示陣列長度 第二行n個整數表示陣列 1 n 10...
牛客網 每日一題 5月19日題目精講 比賽
時間限制 c c 1秒,其他語言2秒 空間限制 c c 131072k,其他語言262144k 64bit io format lld你在打比賽,這場比賽總共有12個題 對於第i個題,你的隊伍有a i 的機率解決她 如果解決不了她呢?由於所有人討論的都很大聲 所以你有b i 的概率從左邊那個隊那裡聽...
牛客網 每日一題 4月23日題目精講 邊的染色
時間限制 c c 1秒,其他語言2秒 空間限制 c c 32768k,其他語言65536k 64bit io format lld小團有一張n個點,m條邊的無向圖g,有些邊上已經被標記了0或1,表示它的邊權。現在你需要給剩下的邊標記邊權為0或1,求有幾種標記的方式滿足 對於g中任意乙個環,裡面所有邊...