解题思路:这里的思路也是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.0分

2 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论