80pts求助(悬2关)
查看原帖
80pts求助(悬2关)
1287433
__ycy1124__楼主2024/8/15 18:18
#include<bits/stdc++.h>
using namespace std;
int x[10001],y[10001];
struct Node{
	int p,l,h;
}nod[10001];
int dp[2][2002];
bool bj[2][2001];
queue<int>q;
bool cmp(Node x1,Node x2){
	return x1.p<x2.p;
}
int main(){
	int n,m,k;
	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<=k;i++){
		scanf("%d%d%d",&nod[i].p,&nod[i].l,&nod[i].h);
	}
	sort(nod+1,nod+k+1,cmp);
	for(int i=1;i<=m;i++){
		dp[0][i]=0;
		bj[1][i]=1;
		bj[0][i]=0;
	}
	for(int i=m+1;i<=2000;i++){
		bj[0][i]=0;
		bj[1][i]=0;
	}
	int tmp=0;
	bool pd;
	for(int i=0;i<=n;i++){
		for(int j=1;j<=m;j++){
			dp[i%2][j]=0;
			bj[i%2][j]=0;
		}
		pd=0;
		for(int j=1;j<=m;j++){
			if(j==m){
				int js=1e9;
				for(int k=max(m-x[i],1);k<=m;k++){
					if(bj[i%2][k]){
						js=min(dp[i%2][k]+1,js);
					}
					if(bj[(i+1)%2][k]){
						js=min(dp[(i+1)%2][k]+1,js);
					}
				}
				if(js!=1e9){
					dp[i%2][m]=js;
					bj[i%2][m]=1;
				}
				else{
					q.push(m);
				}
			}
			else if(j-x[i]>=1){
				if(bj[(i+1)%2][j-x[i]]&&bj[i%2][j-x[i]]&&bj[(i+1)%2][j+y[i]]){
					dp[i%2][j]=min(dp[(i+1)%2][j-x[i]]+1,min(dp[i%2][j-x[i]]+1,dp[(i+1)%2][j+y[i]]));
					bj[i%2][j]=1;
				}
				else if(bj[(i+1)%2][j-x[i]]&&bj[i%2][j-x[i]]&&!bj[(i+1)%2][j+y[i]]){
					dp[i%2][j]=min(dp[(i+1)%2][j-x[i]]+1,dp[i%2][j-x[i]]+1);
					bj[i%2][j]=1;
				}
				else if(bj[(i+1)%2][j-x[i]]&&!bj[i%2][j-x[i]]&&bj[(i+1)%2][j+y[i]]){
					dp[i%2][j]=min(dp[(i+1)%2][j-x[i]]+1,dp[(i+1)%2][j+y[i]]);
					bj[i%2][j]=1;
				}
				else if(!bj[(i+1)%2][j-x[i]]&&bj[i%2][j-x[i]]&&bj[(i+1)%2][j+y[i]]){
					dp[i%2][j]=min(dp[i%2][j-x[i]]+1,dp[(i+1)%2][j+y[i]]);
					bj[i%2][j]=1;
				}
				else if(!bj[(i+1)%2][j-x[i]]&&!bj[i%2][j-x[i]]&&bj[(i+1)%2][j+y[i]]){
					dp[i%2][j]=dp[(i+1)%2][j+y[i]];
					bj[i%2][j]=1;
				}
				else if(!bj[(i+1)%2][j-x[i]]&&bj[i%2][j-x[i]]&&!bj[(i+1)%2][j+y[i]]){
					dp[i%2][j]=dp[i%2][j-x[i]]+1;
					bj[i%2][j]=1;
				}
				else if(bj[(i+1)%2][j-x[i]]&&!bj[i%2][j-x[i]]&&!bj[(i+1)%2][j+y[i]]){
					dp[i%2][j]=dp[(i+1)%2][j-x[i]]+1;
					bj[i%2][j]=1;
				}
				else{
					q.push(j);
				}
			}
			else{
				if(bj[(i+1)%2][j+y[i]]){
					dp[i%2][j]=dp[(i+1)%2][j+y[i]];
					bj[i%2][j]=1;
				}
				else{
					q.push(j);
				}
			}
			if(bj[n%2][j]){
				pd=1;
			}
		}
		while(!q.empty()){
			bj[i%2][q.front()]=0;
			q.pop(); 
		}
		if(i==nod[tmp+1].p-1&&tmp<k){
			tmp++;
			for(int j=1;j<=nod[tmp].l;j++){
				bj[i%2][j]=0;
				dp[i%2][j]=0;
			}
			for(int j=m;j>=nod[tmp].h;j--){
				bj[i%2][j]=0;
				dp[i%2][j]=0;
			}
		}
		/*for(int j=1;j<=m;j++){
			if(bj[i%2][j]){
				cout<<dp[i%2][j]<<'|';	
			}
			else{
				cout<<' '<<'|';
			}
		}
		cout<<'\n';这里是调试*/ 
		if(!pd){
			if(i==nod[tmp].p){
				tmp--;
			}
			printf("0\n");
			printf("%d",tmp);
			return 0;
		}
	}
	int ans=1e9;
	for(int i=1;i<=m;i++){
		if(bj[n%2][i]){
			pd=1;
			ans=min(ans,dp[n%2][i]);
		}
	}
	printf("1\n");
	printf("%d",ans);
	return 0; 
}
2024/8/15 18:18
加载中...