头像

欢迎来到我的博客

分享题解与总结

飞机降落

飞机降落

屏幕截图 2026-03-17 211725

屏幕截图 2026-03-17 211848

思路

  1. dfs

  2. 遍历每一种可能

  3. 按照到达时间+盘旋时间排序遍历——先到达+盘旋短->先下降 (快速找到最优解)

  4. 但是排序后的选择方案,也不一定最优,所以需要找每一种可能,然后剪枝

  5. n架飞机的信息:struct node{int t,d,l;}

  6. dfs(int num,int step,int times)

    num等于n(该组数据的飞机数目)

    step安置了几架飞机

    times当前时间

  7. 判断在当前times下,能否安置余下飞机:

代码1

找到最优解

int q,n,a,b,c,ans,book[N];
struct node{
	int t,l,d;
}nd[N];

bool cmp(node nd1,node nd2)
{
	return nd1.t+nd1.d<nd2.t+nd2.d;
}

void dfs(int num,int step,int times)
{
	int wait;//wait表示前一架飞机落地后(times),到后一架飞机到达(Ti)期间的:纯等待时间
	if(step==num){
		ans=min(ans,times);
		return ;
	}
	if(times>ans) return ;
	for(int i=0;i<num;++i){
		if(book[i]==0){
			if(nd[i].t+nd[i].d>=times){
				book[i]=1;
				wait=max(0,nd[i].t-times);
				dfs(num,step+1,times+wait+nd[i].l);
				book[i]=0;
			}
		}
	}
	return ;
}

int main()
{
	cin>>q;
	while(q--){
		ans=INT_MAX;
		memset(book,0,sizeof(book));
		cin>>n;
		for(int i=0;i<n;++i){
			cin>>nd[i].t>>nd[i].d>>nd[i].l;
		}
		sort(nd,nd+n,cmp);//排序 先到达+盘旋短->先下降
//		for(int i=0;i<n;++i){
//			cout<<nd[i].t<<nd[i].d<<"\n";
//		}
		dfs(n,0,0);
		if(ans!=INT_MAX) cout<<"YES"<<"\n";
		else cout<<"NO"<<"\n"; 
	}
	return 0;
}

代码2

找到可行解,立即返回

int q,n,a,b,c,book[N];
struct node{
	int t,l,d;
}nd[N];

bool cmp(node nd1,node nd2)
{
	return nd1.t+nd1.d<nd2.t+nd2.d;
}

bool dfs(int num,int step,int times)
{
	int wait;//time
	if(step==num){//安置完n架飞机 找到可行解
		return true;
	}
	for(int i=0;i<num;++i){
		if(book[i]==0){
			if(nd[i].t+nd[i].d>=times){
				book[i]=1;
				wait=max(0,nd[i].t-times);
				if(dfs(num,step+1,times+wait+nd[i].l)) 
                    return true;
				book[i]=0;
			}
		}
	}
	return false;//无论从谁开始 全都没找到解
}

int main()
{
	cin>>q;
	while(q--){
		memset(book,0,sizeof(book));
		cin>>n;
		for(int i=0;i<n;++i){
			cin>>nd[i].t>>nd[i].d>>nd[i].l;
		}
		sort(nd,nd+n,cmp);
		if(dfs(n,0,0)) cout<<"YES"<<"\n";
		else cout<<"NO"<<"\n"; 
	}
	return 0;
}
posted @ 2026-03-17 21:46  king_steph1209  阅读(3)  评论(0)    收藏  举报