40分求助
  • 板块P1833 樱花
  • 楼主KingPowers
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/7/19 19:32
  • 上次更新2023/10/27 19:28:51
查看原帖
40分求助
530180
KingPowers楼主2022/7/19 19:32

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;
}

2022/7/19 19:32
加载中...