[2018.10.10 T1] 餐馆

铜企鹅作为餐馆老板,面临食材种植、招牌菜烹饪与销售的时间与金钱管理挑战。在有限时间内,通过合理安排食材种植和招牌菜制作,以最大化年度收益。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

暂无链接

餐馆

题目背景

铜企鹅是企鹅餐馆的老板,他正在计划如何使得自己本年度收益增加。

题目描述

共有nnn种食材,一份食材iii需要花tit_iti小时不间断地进行播种,施肥,直至收获。当然,一份食材iii是可以直接卖掉得到wiw_iwi块钱的。
招牌菜共有mmm种,一份招牌菜iii需要消耗一定的食材,花TiT_iTi小时不间断地来烹饪,叫卖,并最终卖出得到WiW_iWi块钱。
整个季度换算下来一共有TmaxT_{max}Tmax小时可供你使用,铜企鹅需要在这期间赚到最多的钱,这样他才有足够多的钱来steam剁手,或者氪金手游

格式
输入格式

第一行一个整数TTT,表示数据组数。
iii表示为当前数据内行数。
第一行三个整数n,m,Tmaxn, m, T_{max}n,m,Tmax,含义如题所示。
第二行至第n+1n + 1n+1行,每行两个整数ti−1,wi−1t_{i−1}, w_{i−1}ti1,wi1,含义如题所示。
n+2n + 2n+2行至第n+m+1n + m + 1n+m+1行,每行两个整数Ti−n−1,Wi−n−2T_{i−n−1}, W_{i−n−2}Tin1,Win2,含义如题所示。
n+m+2n + m + 2n+m+2行至第n+2m+1n + 2m + 1n+2m+1行,每行nnn个整数,第jjj个数djd_jdj表示招牌菜i−n−m−1i − n − m − 1inm1需要djd_jdj个食材jjj

样例
样例输入

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 ≤nm≤m ≤mT≤T ≤T
111333111111000
222202020111111555
333101010444444555
444171717200020002000000555
555505050200020002000200020002000444

对于100%100\%100%的数据,保证0&lt;ti,Ti≤Tmax≤5000,0≤wi,Wi≤1090 &lt; t_i, T_i ≤ T_{max} ≤ 5000, 0 ≤ w_i, W_i ≤ 10^90<ti,TiTmax5000,0wi,Wi109,每份招牌菜使用的食材的个数总数不超过10510^5105

题解

招牌菜也可以看做一个物品,价值为本身价值,时间为需要的食材时间之和,最后所有招牌菜和原材料一起做个完全背包即可。

然而,如果你不加带buffbuffbuff的读入优化和输出优化,是不可能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();}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShadyPi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值