1 条题解

  • 0

    上代码

    #include<bits/stdc++.h>
    using namespace std;
    long long f1[100001][1001],f2[100001][1001],n,m,c,ji;
    struct node{
        long long s,id;
    }w[300001],v[300001];
    inline int read(){
    	register int x=0;
    	register char ch=getchar();
    	while(ch>'9'||ch<'0')ch=getchar();
    	while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    	return x;
    }
    int main(){
    	cin>>n;
    	for(int i=1;i<=n;++i){
    		int cw=read(),cv=read(),c=read(),now=1;
    		while(now<=c){
    			w[++ji].s=cw*now,v[ji].s=cv*now;
                w[ji].id=i,v[ji].id=i;
    			c-=now,now*=2;
    		}if(c){
    			w[++ji].s=cw*c,v[ji].s=cv*c;
                w[ji].id=i,v[ji].id=i;
    		}
    	}cin>>m;
    	n=ji;
    	for(int i=1;i<=n;i++){
    		for(int j=0;j<=1000;j++)f1[i][j]=f1[i-1][j];
    		for(int j=1000;j>=w[i].s;j--){
    			f1[i][j]=max(f1[i][j],f1[i-1][j-w[i].s]+v[i].s);
    		}
    	}for(int i=n;i>=1;i--){
    		for(int j=0;j<=1000;j++)f2[i][j]=f2[i+1][j];
    		for(int j=1000;j>=w[i].s;j--){
    			f2[i][j]=max(f2[i][j],f2[i+1][j-w[i].s]+v[i].s);
    		}
    	}for(int k=1;k<=m;k++){
    		int cn=read()+1,V=read();
    		long long ans=0;
            int l=0,r=0;
            while(w[l+1].id<cn&&l<n)++l;
            r=l;
            while(w[r+1].id<=cn&&r<n)++r;
    		for(int j=0;j<=V;j++){
    			ans=max(ans,f1[l][j]+f2[r+1][V-j]);
    		}cout<<ans<<endl;
    	}
    }
    
    • 1

    信息

    ID
    3027
    时间
    1000ms
    内存
    125MiB
    难度
    5
    标签
    递交数
    2
    已通过
    1
    上传者