multiple01


私信TA

用户名:uq_11567124893

访问量:976

签 名:

等  级
排  名 14961
经  验 858
参赛次数 0
文章发表 5
年  龄 0
在职情况 学生
学  校 华侨大学
专  业 数据科学与大数据技术

  自我简介:

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

  评论区

  • «
  • »