飞机降落
飞机降落


思路
-
dfs
-
遍历每一种可能
-
按照到达时间+盘旋时间排序遍历——先到达+盘旋短->先下降 (快速找到最优解)
-
但是排序后的选择方案,也不一定最优,所以需要找每一种可能,然后剪枝
-
n架飞机的信息:
struct node{int t,d,l;} -
dfs(int num,int step,int times)num等于n(该组数据的飞机数目)
step安置了几架飞机
times当前时间
-
判断在当前times下,能否安置余下飞机:
代码1
找到最优解
int q,n,a,b,c,ans,book[N];
struct node{
int t,l,d;
}nd[N];
bool cmp(node nd1,node nd2)
{
return nd1.t+nd1.d<nd2.t+nd2.d;
}
void dfs(int num,int step,int times)
{
int wait;//wait表示前一架飞机落地后(times),到后一架飞机到达(Ti)期间的:纯等待时间
if(step==num){
ans=min(ans,times);
return ;
}
if(times>ans) return ;
for(int i=0;i<num;++i){
if(book[i]==0){
if(nd[i].t+nd[i].d>=times){
book[i]=1;
wait=max(0,nd[i].t-times);
dfs(num,step+1,times+wait+nd[i].l);
book[i]=0;
}
}
}
return ;
}
int main()
{
cin>>q;
while(q--){
ans=INT_MAX;
memset(book,0,sizeof(book));
cin>>n;
for(int i=0;i<n;++i){
cin>>nd[i].t>>nd[i].d>>nd[i].l;
}
sort(nd,nd+n,cmp);//排序 先到达+盘旋短->先下降
// for(int i=0;i<n;++i){
// cout<<nd[i].t<<nd[i].d<<"\n";
// }
dfs(n,0,0);
if(ans!=INT_MAX) cout<<"YES"<<"\n";
else cout<<"NO"<<"\n";
}
return 0;
}
代码2
找到可行解,立即返回
int q,n,a,b,c,book[N];
struct node{
int t,l,d;
}nd[N];
bool cmp(node nd1,node nd2)
{
return nd1.t+nd1.d<nd2.t+nd2.d;
}
bool dfs(int num,int step,int times)
{
int wait;//time
if(step==num){//安置完n架飞机 找到可行解
return true;
}
for(int i=0;i<num;++i){
if(book[i]==0){
if(nd[i].t+nd[i].d>=times){
book[i]=1;
wait=max(0,nd[i].t-times);
if(dfs(num,step+1,times+wait+nd[i].l))
return true;
book[i]=0;
}
}
}
return false;//无论从谁开始 全都没找到解
}
int main()
{
cin>>q;
while(q--){
memset(book,0,sizeof(book));
cin>>n;
for(int i=0;i<n;++i){
cin>>nd[i].t>>nd[i].d>>nd[i].l;
}
sort(nd,nd+n,cmp);
if(dfs(n,0,0)) cout<<"YES"<<"\n";
else cout<<"NO"<<"\n";
}
return 0;
}

浙公网安备 33010602011771号