2 条题解

  • 1
    @ 2022-8-8 19:19:09
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    const int N=10001,INF=0x7ffff;
    int n,m,k,x[N],y[N],dow[N],up[N],f[N][2001];
    int main(){
    	scanf("%d%d%d",&n,&m,&k);
    	for(int i=0;i<n;++i)scanf("%d%d",&x[i],&y[i]);
    	for(int i=1;i<=n;++i)dow[i]=0,up[i]=m+1;
    	for(int i=1,p,l,h;i<=k;++i){
    		scanf("%d%d%d",&p,&l,&h);
    		dow[p]=l,up[p]=h;
    	}
    	for(int i=1;i<=n;++i)
    		for(int j=0;j<=m;++j)
    			f[i][j]=INF;
    	f[0][0]=INF;
    	for(int i=1;i<=n;++i){
    		for(int j=1;j<=m;++j){
    			if(j>=x[i-1]){
    				f[i][j]=min(f[i][j],f[i-1][j-x[i-1]]+1);
    				f[i][j]=min(f[i][j],f[i][j-x[i-1]]+1);
    			}
    			if(j==m)
    				for(int k=j-x[i-1];k<=m;++k){
    					f[i][j]=min(f[i][j],f[i-1][k]+1);
    					f[i][j]=min(f[i][j],f[i][k]+1);
    				}
    		}
    		for(int j=dow[i]+1;j<=up[i]-1;++j)
    			if(j+y[i-1]<=m)
    				f[i][j]=min(f[i][j],f[i-1][j+y[i-1]]);
    		for(int j=1;j<=dow[i];++j)f[i][j]=INF;
    		for(int j=up[i];j<=m;++j)f[i][j]=INF;
    	}
    	int cnt=k,ans=INF;
    	for(int i=n;i>=1;--i){
    		for(int j=dow[i]+1;j<=up[i]-1;++j)
    			if(f[i][j]<INF)
    				ans=min(ans,f[i][j]);
    		if(ans!=INF)break;
    		if(up[i]<=m)cnt--;
    	}
    	if(cnt==k)printf("1\n%d\n",ans);
    	else printf("0\n%d\n",cnt);
    	return 0;
    }
    ```cpp

    信息

    ID
    744
    时间
    1000ms
    内存
    256MiB
    难度
    7
    标签
    递交数
    67
    已通过
    15
    上传者