RT,写了个二进制拆分完全背包,难不成无限的时候114514太小了?
#include<bits/stdc++.h>
#define int long long
using namespace std;
int h1,m1,h2,m2,n,cnt,t[10005],c[10005],p[10005],w[1000005],v[1000005],dp[1005],ans=-1;
inline int read()
{
int s=0,k=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar()) if(ch=='-') k=-1;
for(;ch>='0'&&ch<='9';ch=getchar()) s=(s<<1)+(s<<3)+(ch^48);
return s*k;
}
signed main()
{
scanf("%lld:%lld%lld:%lld%lld",&h1,&m1,&h2,&m2,&n);
int m=(h2*60+m2)-(h1*60+m1);
for(int i=1;i<=n;i++)
{
t[i]=read(),c[i]=read(),p[i]=read();
if(!p[i]) p[i]=114514;
for(int j=1;j<=p[i];j<<=1)
{
w[++cnt]=j*t[i],v[cnt]=j*c[i];
p[i]-=j;
}
if(p[i]) w[++cnt]=p[i]*w[i],v[cnt]=p[i]*c[i];
}
memset(dp,-0x3f,sizeof(dp));
dp[0]=0;
for(int i=1;i<=cnt;i++)
for(int j=m;j>=w[i];j--)
dp[j]=max(dp[j],dp[j-w[i]]+v[i]),ans=max(ans,dp[j]);
printf("%lld",ans);
return 0;
}