55分求调 6 RE 3 WA
查看原帖
55分求调 6 RE 3 WA
555833
haozexu楼主2022/3/11 20:37

RE #7 #8 #9 #10 #11 #13

WA #3 #6 #12

#include<bits/stdc++.h>
using namespace std;
#define Maxn 10005
#define Maxm 1005
#define Inf 0x3f3f3f3f
int n,m,k,x[Maxn],y[Maxn],dp[Maxm][Maxn];
pair<int,int> cube[Maxn];
#define up(a) cube[a].first
#define down(a) cube[a].second
void minf(int &a,int b) {
	a=min(a,b);
}

int main() {
	memset(dp,0x3f,sizeof dp);
	cin>>n>>m>>k;
	for(int i=0; i<n; i++) {
		cin>>x[i]>>y[i];
		dp[0][i+1]=0;
		up(i+1)=down(i+1)=-1;
	}
	int h;
	for(int i=0; i<k; i++) {
		cin>>h;
		cin>>down(h)>>up(h);
		for(int j=0; j<=down(h); j++) {
			dp[h][j]=-Inf;
		}
		for(int j=up(h); j<=m; j++) {
			dp[h][j]=-Inf;
		}
	}
	for(int i=0; i<n; i++) {
		for(int j=1; j<=m; j++) {
			if(dp[i][j]==-Inf) continue;
	//		printf("Now is(%d,%d) Can Up %d;Down %d|Go %d\n",i,j,x[i],y[i],(m-j)/x[i]);
			if(x[i]!=0) {
				for(int k=0; k<=(m-j)/x[i]; k++) {
					if(k==0)
					{
					if(j-y[i]>0)
					{
					minf(dp[i+1][j-y[i]],dp[i][j]);		
					}
					}
					else
					{
					if(j+k*x[i]>m) minf(dp[i+1][m],dp[i][j]+k);
					else minf(dp[i+1][j+k*x[i]],dp[i][j]+k);	
					}
				}
				if((m-j)/x[i]==0)
				{
					minf(dp[i+1][m],dp[i][j]+1);
					if(j-y[i]>0) minf(dp[i+1][j-y[i]],dp[i][j]);
				}
			} else {
				minf(dp[i+1][j],dp[i][j]+1);
				if(j-y[i]>0) minf(dp[i+1][j-y[i]],dp[i][j]);
			}
//			test(i,j);
		}
	}
//	test(0,0);
	int mres=Inf;
	for(int i=1; i<=m; i++) {
		if(dp[n][i]!=Inf) minf(mres,dp[n][i]);
	}
	if(mres!=Inf) cout<<1<<endl<<mres;
	else {
		int res=0;
		for(int i=1; i<n; i++) {
			bool f=false;
			for(int j=1; j<=m; j++) {
				if(dp[i][j]!=-Inf&&dp[i][j]!=Inf) {
					f=true;
					break;
				}
			}
			if(f&&up(i)!=-1&&down(i)!=-1) {
				res++;
			}
		}
		cout<<0<<endl<<res;
	}
	return 0;
}




2022/3/11 20:37
加载中...