30pts,why
查看原帖
30pts,why
1329138
luogu_hezhenmin1楼主2024/9/29 20:56

https://www.luogu.com.cn/record/179027305
rt

#include<bits/stdc++.h>
using namespace std;
int h1,m1,h2,m2,t,n,w[10002],v[10002],p[10002],w1[102],v1[102];
int dp[1440];
int main(){
	scanf("%d:%d",&h1,&m1);
	scanf("%d:%d",&h2,&m2);
	t=(h2-h1)*60+m2-m1;
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>w[i]>>v[i]>>p[i];
	for(int i=1;i<=n;i++){
		if(p[i]==0)
			for(int j=w[i];j<=t;j++)
				dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
		else if(p[i]==1)
			for(int j=t;j>=w[i];j--)
			    dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
		else{
			int bk=p[i];
			int cnt=1,bn=1;
			while(bk){
				if(bk>=bn){
					bk-=bn;
					w1[cnt]=w[i]*bn;
					v1[cnt]=v[i]*bn;
					bn*=2;
					cnt++;
				}
				else{
					w1[cnt]=w[i]*bk;
					v1[cnt]=v[i]*bk;
					bk=0;
				}
			}
			for(int j=1;j<=cnt;j++)
				for(int k=t;k>=w1[i];k--)
					dp[k]=max(dp[k],dp[k-w1[i]]+v1[i]);
       }
	}
	cout<<dp[t];
	return 0;
}
2024/9/29 20:56
加载中...