75 WA#5,7,10,11,13求助
查看原帖
75 WA#5,7,10,11,13求助
300078
pengyule楼主2021/8/5 15:29

谢助

#include <bits/stdc++.h>
using namespace std;
const int N=1e4+5,M=1e3+5,INF=0x3f3f3f3f;
int f[N][M][2],x[N],y[N],a[N][M],has[N];
int main(){//freopen("P1941_4.in","r",stdin);
	int n,m,k;
	cin>>n>>m>>k;
	for(int i=1;i<=n;i++)
		cin>>x[i]>>y[i];
	for(int i=1,p,l,h;i<=k;i++){
		cin>>p>>l>>h;
		has[p]=1;
		for(int j=l+1;j<h;j++)
			a[p][j]=1;
	}
	for(int i=0;i<=n;i++)
		if(!has[i])
			for(int j=1;j<=m;j++)
				a[i][j]=1;
	memset(f,0x3f,sizeof(f));
	for(int i=1;i<=m;i++)
		if(a[0][i])f[0][i][0]=0;
	for(int i=1;i<=n;i++){
		has[i]+=has[i-1];
		for(int j=1;j<=m;j++){
			if(j+y[i]<=m)
				f[i][j][0]=min(f[i-1][j+y[i]][0],f[i-1][j+y[i]][1]);
			//else f[i][j][0]=INF;
		}
		for(int j=1;j<m;j++){
			if(j>=x[i])
				f[i][j][1]=min(f[i][j-x[i]][1],min(f[i-1][j-x[i]][0],f[i-1][j-x[i]][1]))+1;
			//else f[i][j][1]=INF;
		}
		for(int j=max(0,m-x[i]);j<m;j++)
			f[i][m][1]=min(min(f[i][m][1],f[i][j][1]+1),min(f[i-1][j][0],f[i-1][j][1])+1);
		for(int j=1;j<=m;j++)if(!a[i][j])f[i][j][0]=f[i][j][1]=INF;
		bool flag=1;
		for(int j=1;j<=m;j++){
			if(f[i][j][0]<INF||f[i][j][1]<INF)flag=0;
		}
		if(flag){cout<<0<<endl<<has[i-1]<<endl;return 0;}
	}

	int ans=INF;
	for(int i=1;i<=m;i++)
		ans=min(ans,min(f[n][i][0],f[n][i][1]));
	cout<<1<<endl<<ans<<endl;
}
2021/8/5 15:29
加载中...