暂无链接
餐馆
题目背景
铜企鹅是企鹅餐馆的老板,他正在计划如何使得自己本年度收益增加。
题目描述
共有
n
n
n种食材,一份食材
i
i
i需要花
t
i
t_i
ti小时不间断地进行播种,施肥,直至收获。当然,一份食材
i
i
i是可以直接卖掉得到
w
i
w_i
wi块钱的。
招牌菜共有
m
m
m种,一份招牌菜
i
i
i需要消耗一定的食材,花
T
i
T_i
Ti小时不间断地来烹饪,叫卖,并最终卖出得到
W
i
W_i
Wi块钱。
整个季度换算下来一共有
T
m
a
x
T_{max}
Tmax小时可供你使用,铜企鹅需要在这期间赚到最多的钱,这样他才有足够多的钱来steam剁手,或者氪金手游。
格式
输入格式
第一行一个整数
T
T
T,表示数据组数。
令
i
i
i表示为当前数据内行数。
第一行三个整数
n
,
m
,
T
m
a
x
n, m, T_{max}
n,m,Tmax,含义如题所示。
第二行至第
n
+
1
n + 1
n+1行,每行两个整数
t
i
−
1
,
w
i
−
1
t_{i−1}, w_{i−1}
ti−1,wi−1,含义如题所示。
第
n
+
2
n + 2
n+2行至第
n
+
m
+
1
n + m + 1
n+m+1行,每行两个整数
T
i
−
n
−
1
,
W
i
−
n
−
2
T_{i−n−1}, W_{i−n−2}
Ti−n−1,Wi−n−2,含义如题所示。
第
n
+
m
+
2
n + m + 2
n+m+2行至第
n
+
2
m
+
1
n + 2m + 1
n+2m+1行,每行
n
n
n个整数,第
j
j
j个数
d
j
d_j
dj表示招牌菜
i
−
n
−
m
−
1
i − n − m − 1
i−n−m−1需要
d
j
d_j
dj个食材
j
j
j。
样例
样例输入
3
1 1 48
2 2000
9 21864 5
4 4 46
17 52
4 36
5 43
16 62
9 31659
1 20431
4 623
1 11961
4 5 3 5
5 4 3 4
3 3 3 3
4 4 5 5
10 0 48
10 41
18 48
2 14
22 65
12 77
7 48
4 85
2 61
24 85
8 34
样例输出
53728
410
1464
3
数据范围
Subtask | 分值 | n ≤ n ≤ n≤ | m ≤ m ≤ m≤ | T ≤ T ≤ T≤ |
---|---|---|---|---|
1 1 1 | 3 3 3 | 1 1 1 | 1 1 1 | 0 0 0 |
2 2 2 | 20 20 20 | 1 1 1 | 1 1 1 | 5 5 5 |
3 3 3 | 10 10 10 | 4 4 4 | 4 4 4 | 5 5 5 |
4 4 4 | 17 17 17 | 2000 2000 2000 | 0 0 0 | 5 5 5 |
5 5 5 | 50 50 50 | 2000 2000 2000 | 2000 2000 2000 | 4 4 4 |
对于 100 % 100\% 100%的数据,保证 0 < t i , T i ≤ T m a x ≤ 5000 , 0 ≤ w i , W i ≤ 1 0 9 0 < t_i, T_i ≤ T_{max} ≤ 5000, 0 ≤ w_i, W_i ≤ 10^9 0<ti,Ti≤Tmax≤5000,0≤wi,Wi≤109,每份招牌菜使用的食材的个数总数不超过 1 0 5 10^5 105。
题解
招牌菜也可以看做一个物品,价值为本身价值,时间为需要的食材时间之和,最后所有招牌菜和原材料一起做个完全背包即可。
然而,如果你不加带 b u f f buff buff的读入优化和输出优化,是不可能A的。。。
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int M=5005;
struct sd{ll t,w;}sth[M];
ll dp[M],ans;
int T,n,m,mx,tot;
char c;
inline char nc()
{
static const int buflen=1e6;
static char buf[buflen],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,buflen,stdin),p1==p2)?EOF:*p1++;
}
int read()
{
int r=0,f=1;
while(!isdigit(c)){if(c=='-')f=-1;c=nc();}
while(isdigit(c)){r=(r<<1)+(r<<3)+c-'0',c=nc();}
return r*f;
}
void out(ll x)
{
if(x>9)out(x/10);
putchar(x%10+'0');
}
void reset(){memset(dp,ans=tot=0,sizeof(dp));}
void in()
{
n=read(),m=read(),mx=read();
for(int i=1,a,b;i<=n;++i)a=read(),b=read(),sth[++tot]=(sd){a,b};
for(int i=1,a,b;i<=m;++i)a=read(),b=read(),sth[++tot]=(sd){a,b};
for(int i=1,j,a;i<=m;++i)for(int j=1;j<=n;++j)a=read(),sth[n+i].t+=1ll*a*sth[j].t;
}
void ac()
{
dp[0]=1;
for(int i=1;i<=tot;++i)for(int j=sth[i].t;j<=mx;++j)
if(dp[j-sth[i].t])dp[j]=max(dp[j-sth[i].t]+sth[i].w,dp[j]);
for(int i=1;i<=mx;++i)ans=max(ans,dp[i]);
out(ans-1),putchar(10);
}
int main(){for(scanf("%d",&T);T--;)reset(),in(),ac();}