题意概括:一共有T组数据,每组数据有n架飞机,每架飞机都有到达时间t,可以盘旋的时间d,降落所需要的时间l。要求在此架飞机降落完成后下一架飞机才可以开始降落,求每组数据的n架飞机是否都可以全部安全降落。
教给~~朋友们一个小技巧=====》每次读完题之后要看一下数据范围,可以更好的帮助我们判断使用何种方法去解这道题。比如,朋友们做题的时候老超时就是这个原因,这时候咱就要去优化我们的算法去解决这道问题,降低代码的时间复杂度和空间复杂度。
回到这题目上,打眼一看,数据范围很小。一般情况下,不是dfs就是bfs。深度优先搜索和广度优先搜索,不知道的朋友们可以先去了解一下dfs和bfs,这是我之前看过的,写的很好。飞机降落这道题就是一道dfs。我的代码里面已经有很详细的注释了,大家自己看一下,看完之后试试可不可以自己做出来,后面再回来复习一下。
解题思路:数据范围较小,切经过上面的分析。我们就可以很明确的去使用dfs来枚举每架飞机的降落,若是存在每架飞机都可以降落的情况就返回true,若是枚举完都没有这种情况就返回flase。
代码后面的注释稍微有点繁琐,但是可以很好的帮助初学者去理解,希望可以帮助到大家
#include<iostream>//头文件
#include<cstring>//使用memset初始化
#include<vector>//动态数组
#include<cmath>//使用std::min和std::max
#define int long long //个人习惯,经常性忘记看数据范围,每次都宏定义好后面直接可以用 int
#define endl "\n"//换行更快一点
#define ios std::ios::sync_with_stdio(0),std::cin.tie(0),std::cout.tie(0)//给程序提速
//using namespace std; 命名空间 做大型程序的话建议不用命名空间,和我一样每次使用std::更好一点
typedef struct plane{//建一个飞机结构体
int t;// 到达时间
int d;// 到达之后最多的盘旋时间
int l;// 降落所需时间
}feiji;//重命名
std::vector<feiji>lp(15);//建一个数组,题目n<=10,稍微开大一点开到15
int v[15];//看某架飞机是否已经完成降落 0:还未降落 1:已经降落
//也可以用bool 已经降落用true 未降落用false
bool flag;//看是否全部的飞机降落完毕
//返回值为空
void dfs(int n,int x,int shijian)//(飞机个数,一降落的飞机个数,x架飞机降落所用时间)
{
if(n==x)//若是已降落飞机个数==飞机总数
{
flag=true;//给flag赋值true,并返回
return;
}
for(int i=0;i<n;i++)
{//从第一架飞机向后遍历,若是还未降落&&到达时间>=前面已经使用的时间
if(v[i]==0&&lp[i].t+lp[i].d>=shijian)
{
v[i]=1;//将这架飞机标记为已经降落
dfs(n,x+1,std::max(shijian,lp[i].t)+lp[i].l);//飞机总架数不变,已经降落架数加一,后面这个仔细考虑一下
v[i]=0;//回溯 重新将这架飞机标记为未降落
}
}
}
void solve()
{
int t;std::cin>>t;//t组数据
while(t--)
{
int n;std::cin>>n;//n架飞机
memset(v,0,sizeof(v));//使用memset初始化 (数组首地址,改变后的值,数组大小)
flag=false;//初始化为false 表示飞机还没有全部降落
for(int i=0;i<n;i++)//输入n架飞机的数据
std::cin>>lp[i].t>>lp[i].d>>lp[i].l;
dfs(n,0,0);//调用dfs函数
if(flag==true)std::cout<<"YES"<<endl;
else std::cout<<"NO"<<endl;
}
}
signed main()//已经宏定义了int查找替换为long long,所以用signed
{
ios;//已经宏定义好的
solve();//将程序全部写在函数中,更方便我们找出错误
return 0;//蓝桥杯规则返回值必须为零 小伙伴们不要忘记
}
下面是我自己每次做题时候用的,做题之前打好,做题直接复制粘贴就ok,把自己的程序写在solve函数里面。具体问题具体分析,比如我们要用memset()来给数组初始化就再加上它的头文件#include<cstring> ,需要使用vector建一个动态数组就加上#include<vector>......
#include<iostream>
#define int long long
#define endl "\n"
#define ios std::ios::sync_with_stdio(0),std::cin.tie(0),std::cout.tie(0)
void solve()
{
}
signed main()
{
ios;
solve();
return 0;
}