70分求调~~~真的不知道哪里错了
查看原帖
70分求调~~~真的不知道哪里错了
749959
the_night楼主2022/11/14 17:27
#include <bits/stdc++.h>
using namespace std;
#define N 100010
#define M 1010
#define inf 100000000
int n,m,k;
int up[N],down[N];
int pos[N],h1[N],h2[N];
int f[N][M],vis[N][M];
void init(){
	for(int i=0;i<=n;i++){
		for(int j=0;j<=m;j++){
			f[i][j]=inf;
		}
	}
	for(int i=1;i<=m;i++){
		vis[0][i]=1;
		f[0][i]=0;
	}
}
int main(){
	cin>>n>>m>>k;
	for(int i=1;i<=n;i++){
		cin>>up[i]>>down[i];
	}
	for(int i=1;i<=k;i++){
		cin>>pos[i]>>h1[i]>>h2[i];
		for(int j=0;j<=h1[i];j++){
			vis[pos[i]][j]=-1;
		}
		for(int j=h2[i];j<=m;j++){
			vis[pos[i]][j]=-1;
		}
	}
	init();
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m+up[i];j++){
			if(j-up[i]>=0){
				if(vis[i][j]!=-1&&vis[i-1][j-up[i]]==1){
					if(j>=m){
						if(vis[i][m]!=-1){
							f[i][m]=min(f[i][m],f[i-1][j-up[i]]+1);
							vis[i][m]=1;
						}	
					}
					else{
						f[i][j]=min(f[i][j],f[i-1][j-up[i]]+1);
						vis[i][j]=1;
					}
				}	
			}
			if(j+down[i]<=m){
				if(vis[i][j]!=-1&&vis[i-1][j+down[i]]==1){
					vis[i][j]=1;
					f[i][j]=min(f[i][j],f[i-1][j+down[i]]);
				}
			}
		}
		for(int j=up[i]+1;j<=m+up[i];j++){
			if(vis[i][j]!=-1&&vis[i][j-up[i]]==1){
				if(j>=m){
					if(vis[i][m]!=-1){
						vis[i][m]=1;
						f[i][m]=min(f[i][m],f[i][j-up[i]]+1);
					}	
				}
				else{
					vis[i][j]=1;
					f[i][j]=min(f[i][j],f[i][j-up[i]]+1);
				}
			}
		}
	}
	int flag=false,ans=inf;
	for(int i=1;i<=m;i++){
		if(vis[n][i]){
			flag=true;
			ans=min(ans,f[n][i]);
		}
	}
	if(flag) cout<<1<<endl<<ans;
	else{
		int sum=0,ans2=0;
		for(int i=1;i<=n-1;i++){
			for(int j=1;j<=m;j++){
				if(vis[i][j]){
					sum=i;
					break;
				}
			}
		}
		sort(pos+1,pos+1+k);
		for(int i=1;i<=k;i++){
			if(pos[i]<sum) ans2++;
			else break;
		}
		cout<<0<<endl<<ans2;
	}
	return 0;
}
2022/11/14 17:27
加载中...