解题思路:这里的思路也是dfs,深度优先遍历
注意事项: 写在注释里了,但是感觉会重复多算一次本身的排列,如果可以的话,有无大佬再优化一下
参考代码:
#include<bits/stdc++.h>
using namespace std;
struct Plane{ //这里采用的结构体,默认都是public,如果采用class的话,下面那些int的位置要调整
int start_time,wait_time,lying_time;
Plane () =default; //这里是设置默认参数,避免后面声明vector的时候出现报错
Plane(int a,int b,int c){
this->start_time=a; //开始时间
this->wait_time=b; //盘旋时间
this->lying_time=c; //下降时间
}
};
bool dfs(vector<Plane> &plane,vector<bool> &bl,int pre ,int count){ //dfs的方法核心代码
if (count==plane.size()) return true; //代表全部匹配上了
for(int q=0;q<plane.size();q++) //第一层循环控制飞机安排顺序
{
if(!bl[q])
{
bl[q]=true; //重置飞机排列序号
if(pre<plane[q].start_time) //排列顺序第一架飞机出现的情况,且初始时间不为0
{
if(dfs(plane,bl,plane[q].start_time+plane[q].lying_time,count+1))
return true;
}
else if(pre<= plane[q].start_time+plane[q].wait_time){
if(dfs(plane,bl,pre+plane[q].lying_time,count+1)) //其他飞机的情况
return true;
}
bl[q]=false; //重置飞机排列序号
}
}
return false;
}
int main()
{
int T; //总共的组数
int N; //一组中的飞机架数
int st,wt,lt; //那三个输入的量
cin>>T;
for(int i=0;i<T;i++)
{
cin>>N;
vector<Plane> plane(N); //这里就是前文如果没有default会出现报错的问题了
vector<bool> bl(N,false);
int count=0;
int pre=0;
for(int j=0;j<N;j++)
{
cin>>st>>wt>>lt;
plane[j]=Plane(st,wt,lt); //已经知道序号,通过序号来,而不是push_back,时间效率会提升那么一点点
}
if(dfs(plane,bl,pre,count)) cout<<"YES";
else cout<<"NO";
cout<<endl;
}
}
0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复