75pts求助!
查看原帖
75pts求助!
348196
CZ_7楼主2021/8/22 16:44

RT,萌新根本改不对,求帮助

#include<bits/stdc++.h>
using namespace std;
int dp[2010],low[2010],upp[2010],no[10010][2010],cnt,you[10010];
int n,m,k,x[10010],y[10010],z,l,r;
int main(){
	//freopen("stO","r",stdin);
	//freopen("Orz","w",stdout);
	cin>>n>>m>>k;
	for(int i=0;i<n;i++)cin>>x[i]>>y[i];
	for(int i=1;i<=k;i++){
		cin>>z>>l>>r;
		you[z]=1;
		for(int j=0;j<=l;j++)no[z][j]=0x3f3f3f;
		for(int j=r;j<=m;j++)no[z][j]=0x3f3f3f;
	}
//	dp[0]=1e9;
	//for(int j=1;j<=m;j++)printf("%-12d",dp[j]);
	//cout<<endl;
	memset(upp,0x3f,sizeof(upp));
	memset(low,0x3f,sizeof(low));
	for(int j=x[0];j<=m+x[0];j++){
		if(!no[1][min(j,m)]){
			upp[min(j,m)]=min(upp[j-x[0]]+1,min(dp[j-x[0]]+1,upp[min(j,m)]));
		}
	}
	//cout<<upp[m];
	//cout<<endl;
	for(int j=m-y[0];j>=1;j--){
		if(!no[1][j]){
			low[j]=dp[j+y[0]];
		}
	}
	for(int j=1;j<=m;j++){
		dp[j]=min(upp[j],low[j]);
		if(dp[j]<0x3f3f3f3f)cnt=1;
	}
	for(int i=2;i<=n;i++){
		//for(int j=1;j<=m;j++)printf("%-12d",dp[j]);
		//cout<<endl;
		memset(upp,0x3f,sizeof(upp));
		memset(low,0x3f,sizeof(low));
		for(int j=x[i-1]+1;j<=m+x[i-1];j++){
			if(!no[i][min(j,m)]){
				upp[min(j,m)]=min(upp[j-x[i-1]]+1,min(dp[j-x[i-1]]+1,upp[min(j,m)]));
			}
		}
		//cout<<upp[m];
		//cout<<endl;
		for(int j=m-y[i-1];j>=1;j--){
			if(!no[i][j]){
				low[j]=dp[j+y[i-1]];
			}
		}
		for(int j=1;j<=m;j++){
			dp[j]=min(upp[j],low[j]);
			if(dp[j]<0x3f3f3f)cnt=i;
		}
	}
	if(cnt!=n){
		int over=0;
		for(int i=0;i<=cnt;i++){
			if(you[i])over++;
		}
		printf("0\n%d",over);
		return 0;
	}
	int over=0x3f3f3f;
	for(int i=1;i<=m;i++)over=min(over,dp[i]);
	printf("1\n%d",over);
}

stO helper Orz

2021/8/22 16:44
加载中...