解题思路:
n限制小,选择暴力枚举,找到降落顺序,详细注释
注意事项:
参考代码:
#include using namespace std; const int N = 10+20; struct plane{ int t,d,l; }p[N];//飞机 int n; bool sc[N];//记录飞机是否成功降落 bool dfs(int u,int time){//u表示安排到第几架飞机,time表示上一架飞机降落的时间 if(u>=n) return true;//当u>=n时表示所有的飞机都降落成功,返回true for(int i=0;i<n;i++){//遍历飞机数组 if(!sc[i]){//找到还没有降落的飞机看是否满足降落条件 sc[i] = true;//先标记成功降落 if(p[i].t+p[i].d < time){//当该飞机到达时间与盘旋时间和小于上一架飞机降落时间 //说明这架飞机不能成功降落,回溯降落状态, sc[i] = false; //并且这架飞机在此序列无法成功降落那么后续也无法成功(time会增大,if条件也不会满足) return false; } //得到这架飞机降落的时间 // max(time,p[i].t):飞机开始降落前花费的时间 //值为time时:飞机到达但上一架飞机还未落地,只能等到上一飞机落地后开始降落 //值 p[i].t: 飞机到达且上一架飞机已经落地,到达后就降落 int t = max(time,p[i].t) + p[i].l; //确定该架飞机此时降落 ,继续寻找下一个降落的飞机 if(dfs(u+1,t)) return true;//该降落顺序飞机全部能降落 //后续有飞机不满足降落条件,回溯前面的降落顺序,重新寻找 sc[i] = false; } } return false;//当第u架飞机可以降落,但后续的飞机都无法在此基础上成功降落, //if(dfs(u+1,t)) return true;他执行的条件是在这个第u架飞机降落基础上后续的飞机存在合理的降落次序 //当后续的飞机不存在合理的降落次序时dfs(u+1,t) 就返回的是false, //此时就要最后的return false去返回false } void solve(){ cin>>n; for(int i=0;i>p[i].t>>p[i].d>>p[i].l; sc[i] = false; } if(dfs(0,0)) cout<<"YES"<<endl; else cout<<"NO"<>t; while(t--){ solve(); } return 0; }
0.0分
9 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复