三个点 WA
long long 没必要开数组也开大了但是懒得改了
我不管我就是不想用进制优化
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#define maxn 1000010
#define int long long
using namespace std;
char s;
int times,n;
int hh1,hh2,mm1,mm2;
int c[maxn],w[maxn],p[maxn];
int f[maxn];
int ans;
int read(){
int s=0,w=1;
char ch=getchar();
while(ch<'0' ||ch>'9'){
if(ch=='-') w=-1;
ch=getchar();
}
while(ch>='0' &&ch<='9') s=(s<<1)+(s<<3)+ch-'0',ch=getchar();
return s*w;
}
void Pack01(int cos,int wei){
for(int i=times;i>=cos;i--)
f[i]=max(f[i],f[i-cos]+wei);
}
void PackCom(int cos,int wei){
for(int i=cos;i<=times;i++)
f[i]=max(f[i],f[i-cos]+wei);
}
void PackH(int cos,int wei,int cnt){
if(cos*cnt>=times){
PackCom(cos,wei);
return;
}
int k=1;
while(k<cnt){
Pack01(k*cos,k*wei);
cnt-=k;
k*=2;
}
Pack01(cos,wei);
}
signed main(){
cin>>hh1>>s>>mm1;
cin>>hh2>>s>>mm2;
n=read();
times=60*(hh2-hh1)+mm2-mm1;
memset(f,-1,sizeof f);
f[0]=0;
for(int i=1;i<=n;i++){
c[i]=read();w[i]=read();p[i]=read();
if(p[i]==0) PackCom(c[i],w[i]);
else PackH(c[i],w[i],p[i]);
}
for(int i=1;i<=times;i++)ans=max(ans,f[i]);
printf("%lld",ans);
return 0;
}