蓝桥杯飞机降落(DFS、贪心)

蓝桥杯飞机降落(DFS、贪心)_第1张图片

输入样例:

2
3
0 100 10
10 10 10
0 2 20
3
0 10 20
10 10 20
20 10 20

输出样例:

YES
NO

 

题目对数据要求不是很大,且想要看看是否能找到一种飞机降落可行的顺序,所以可以尝试暴力dfs

dfs:对每一个分支深入到不能再深入为止,且每条分支上每个节点只能出现一次。

结构:dfs()

{1.终止条件

2.递归过程}

本题贪心比较明显,类似基础的活动时间安排贪心,即如果每架飞机降落的时间尽可能考前,那么留给后面飞机的时间就多,就更有可能完成所有飞机的降落。

而时间应该取max(Ti,time(前一架飞机降落的时间)),当前一架飞机降落的时间超出后一架飞机时,则该种方案不成立,当中断。

#include
using namespace std;
#define N 15
#define int long long//蓝桥杯最好都开long long 防止溢出 
bool v[N];
int T,n,f=0;
struct node
{
	int t,d,l;
}p[N];

void dfs(int c,int time)
{
	if(c==n)
	{
		f=1;
		return;
	}//终止条件 
	for(int i=1;i<=n;i++)
	{
		if(!v[i]&&(p[i].d+p[i].t>=time))//递归条件 
		{
			v[i]=true;
			dfs(c+1,max(p[i].t,time)+p[i].l);
			v[i]=false;
		}
	}
}

signed main() 
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);//提高输入输出效率 
	cin>>T;
	while(T--)//多组输入 
	{
		cin>>n;
		for(int i=1;i<=n;i++) 
		{
		    cin>>p[i].t;
			cin>>p[i].d;
			cin>>p[i].l;
			v[i]=false;	
		}
		f=0;//每次f都要初始化为0,补药忘了 
		dfs(0,0);
		if(f) cout<<"YES"<

你可能感兴趣的:(深度优先,蓝桥杯,算法,c++)