代码求调75pts
查看原帖
代码求调75pts
604255
perry_lin2333楼主2022/11/10 20:21

rt,提交记录在这

#include<iostream>
#include<cstdio>
#include<cmath>
const int N = 1107;
int price[N<<4],value[N<<4],cnt;
int separate[N];// 左开右闭 
int dp1[N<<4][N],dp2[N<<4][N];
signed main(){
	int n,q;
	scanf("%d",&n);
	for(int i=1,p,v,l;i<=n;i++){
		scanf("%d%d%d",&p,&v,&l);
		separate[i] = cnt;
		for(int times=1;times<=l;times<<=1){
			price[++cnt] = p*times;
			value[cnt] = v*times;
			l -= times;
		}
		if(l){
			price[++cnt] = l*p;
			value[cnt] = l*v;
		}
	}
	separate[n+1] = cnt;
	//front->back
	for(int i=1;i<=cnt+1;i++){
		for(int j=0;j<price[i];j++) dp1[i][j] = dp1[i-1][j];
		for(int j=price[i];j<=1100;j++) dp1[i][j] = std::max(dp1[i-1][j],dp1[i-1][j-price[i]]+value[i]);
	}
	//back->front
	for(int i=cnt+1;i>=1;i--){
		for(int j=0;j<price[i];j++) dp2[i][j] = dp2[i+1][j];
		for(int j=price[i];j<=1100;j++) dp2[i][j] = std::max(dp2[i+1][j],dp2[i+1][j-price[i]]+value[i]);
	}
	scanf("%d",&q);
	while(q--){
		int erase,money;
		scanf("%d%d",&erase,&money);
		erase++;
		int ans = 0;
		for(int i=0;i<=money;i++) ans = std::max(ans,dp1[separate[erase]][i]+dp2[separate[erase+1]+1][money-i]);
//		printf("DEBUG l:%d r:%d\n",separate[erase],separate[erase+1]+1);
		printf("%d\n",ans);
	}
	return 0;
} 
2022/11/10 20:21
加载中...