求助,请问这样写思路有什么问题吗
查看原帖
求助,请问这样写思路有什么问题吗
457208
telesport楼主2021/9/24 13:01
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
int up[10005],down[10005],cnt=1;
struct node{
	int high,low,pos;
}zz[10005];
int f[10005][1005];//i位置j高度 
bool pd;
bool cmp(node o,node p){
	return o.pos<p.pos;
} 
int main(){
	int i,j,m,n,k,ans=0x3f3f3f3f;
	cin>>n>>m>>k;
	for(i=1;i<=n;i++) cin>>up[i]>>down[i];
	for(i=1;i<=k;i++){
		cin>>zz[i].pos>>zz[i].low>>zz[i].high;
	}
	sort(zz+1,zz+1+k,cmp);
	memset(f,0x3f,sizeof(f));
	for(i=1;i<=m;i++){
		f[0][m]=0;
	}
	for(i=1;i<=n;i++){
		for(j=1;j<=m-down[i];j++){
			f[i][j]=min(f[i][j],f[i-1][j+down[i]]);
		}
		for(j=up[i]+1;j<=m+up[i];j++){
			f[i][j]=min(f[i-1][j-up[i]],f[i][j-up[i]])+1;
		}
		for(j=m+1;j<=m+up[i];j++){
			f[i][m]=min(f[i][j],f[i][m]);
		}
		if(i==zz[cnt].pos){
//			cout<<zz[cnt].pos<<" "<<zz[cnt].low<<" "<<zz[cnt].high<<endl;
			for(j=1;j<=m;j++){
//				if(f[i][j]!=0x3f3f3f3f) cout<<j<<" ";
				if(j<=zz[cnt].low||j>=zz[cnt].high) f[i][j]=0x3f3f3f3f;
			}
			pd=false;
			for(j=1;j<=m;j++){
				if(f[i][j]!=0x3f3f3f3f){
					pd=true;
					break;
				}
			}
			if(!pd){
				cout<<0<<endl<<cnt-1;
				return 0;
			}
			else{
				cnt++;
			}
		}
	}
	for(i=1;i<=m;i++){
		ans=min(ans,f[n][i]);
	}
	if(ans!=0x3f3f3f3f){
		cout<<1<<endl<<ans;	
	} 
	return 0;
} 
2021/9/24 13:01
加载中...