AC:
#include <iostream>
#include <algorithm>
using namespace std;
int n, maxt, t[10005], c[10005], p[10005];
long long dp[1005];
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int h1, m1, h2, m2;
char tmp;
cin >> h1 >> tmp >> m1 >> h2 >> tmp >> m2 >> n;
maxt = h2 * 60 - h1 * 60 + m2 - m1;
for (int i = 1; i <= n; i++)
cin >> t[i] >> c[i] >> p[i];
for (int i = 1; i <= n; i++)
{
if ((p[i] == 0) || (t[i] * p[i] >= maxt))
for (int j = t[i]; j <= maxt; j++)
dp[j] = max(dp[j], dp[j - t[i]] + c[i]);
else
for (int x = 1; p[i] > 0; x <<= 1)
{
int tmp = min(x, p[i]);
for (int j = maxt; j >= tmp * t[i]; j--)
dp[j] = max(dp[j], dp[j - tmp * t[i]] + tmp * c[i]);
p[i] -= tmp;
}
}
cout << dp[maxt] << "\n";
return 0;
}
30分:
#include <iostream>
#include <algorithm>
using namespace std;
int n, maxt, t[10005], c[10005], p[10005];
long long dp[1005];
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int h1, m1, h2, m2;
char tmp;
cin >> h1 >> tmp >> m1 >> h2 >> tmp >> m2 >> n;
maxt = h2 * 60 - h1 * 60 + m2 - m1;
for (int i = 1; i <= n; i++)
cin >> t[i] >> c[i] >> p[i];
for (int i = 1; i <= n; i++)
{
if ((p[i] == 0) || (t[i] * p[i] >= maxt))
for (int j = t[i]; j <= maxt; j++)
dp[j] = max(dp[j], dp[j - t[i]] + c[i]);
else
{
int tmp = 1;
while (tmp <= p[i])
{
for (int j = maxt; j >= tmp * t[i]; j--)
dp[j] = max(dp[j], dp[j - tmp * t[i]] + tmp * c[i]);
tmp <<= 1;
}
tmp >>= 1;
for (int j = maxt; j >= (c[i] - tmp) * t[i]; j--)
dp[j] = max(dp[j], dp[j - tmp * t[i]] + tmp * c[i]);
}
}
cout << dp[maxt] << "\n";
return 0;
}