95求助
查看原帖
95求助
362627
frank15楼主2021/5/14 22:18
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=3e4+5,inf=(1<<29)-1;
int n,m,k,p,l,h;
int x[maxn],y[maxn],up[maxn],low[maxn],sum[maxn];
int f[maxn][3005];
int main(){
	scanf("%d%d%d",&n,&m,&k);
	for(int i=1;i<=n;i++)
		scanf("%d%d",&x[i],&y[i]);
	for(int i=1;i<=n;i++){
		low[i]=1;
		up[i]=m;
	}
	for(int i=1;i<=k;i++){
		scanf("%d%d%d",&p,&l,&h);
		low[p]=l+1;
		up[p]=h-1;
		sum[p]=1;
	}
	for(int i=1;i<=n;i++){
		sum[i]+=sum[i-1];
		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++)
//			printf("%7d ",f[i][j]);
//	cout<<endl;
	for(int i=1;i<=n;i++){
		for(int j=x[i]+1;j<=m+x[i];j++)
			f[i][j]=min(f[i-1][j-x[i]]+1,f[i][j-x[i]]+1);
		for(int j=m+1;j<=m+x[i];j++)
			f[i][m]=min(f[i][m],f[i][j]);
		for(int j=1;j<=m-y[i];j++)
			f[i][j]=min(f[i][j],f[i-1][j+y[i]]);
		for(int j=1;j<low[i];j++)
			f[i][j]=inf;
		for(int j=up[i]+1;j<=m;j++)
			f[i][j]=inf;
//		for(int j=1;j<=m;j++)
//			printf("%7d ",f[i][j]);
//		puts("");
		bool flag=1;
		for(int j=1;j<=m;j++)
			if(f[i][j]!=inf){
				flag=0;
				break;
			}
		if(flag){
			printf("0\n%d",sum[i]-(!(low[i]==1&&up[i]==m)));
			return 0;
		}
	}
	int ans=inf;
	for(int j=1;j<=m;j++)
		ans=min(ans,f[n][j]);
	printf("1\n%d",ans);
}
2021/5/14 22:18
加载中...