4957. 飞机降落 - AcWing题库
数据量很小,直接爆搜
#include<bits/stdc++.h>
using namespace std;
const int N=20;
int n,t,flag,st[N];//st记录是否已经降落,flag标记是否降落完成
struct Node
{
int t,d,l;
}node[N];
void dfs(int u,int last)//u表示已经降落的飞机数量,last表示上一架飞机降落完成的时间
{
if(u>=n)//已经全部降落
{
printf("YES\n");
flag=1;
return;
}
if(flag)return;//已经完成就不再搜索
// printf("%d %d\n",u,last);
for(int i=0;i<n;i++)
{
if(st[i]==0)
{
int t=node[i].t,d=node[i].d,l=node[i].l;
if(t+d<last)return;//如果最迟降落时间已经过去就不满足,剪掉
st[i]=1;
dfs(u+1,max(last,t)+l);
st[i]=0;
}
}
}
int main()
{
scanf("%d",&t);
while(t--)
{
memset(st,0,sizeof st);
flag=0;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
int t,d,l;
scanf("%d %d %d",&t,&d,&l);
node[i]={t,d,l};
}
dfs(0,0);
if(flag==0)printf("NO\n");
}
return 0;
}
next_permutation:
#include<bits/stdc++.h>
using namespace std;
int n , m , k ;
struct{
int t , d , l ;
}g[15] ;
int a[15] ;
void solve()
{
ios::sync_with_stdio(0) , cin.tie(0) , cout.tie(0) ;
cin >> n ;
for(int i = 1 ; i <= n ; i ++) a[i] = i;
for(int i = 1 ; i <= n ; i ++) cin >> g[i].t >> g[i].d >> g[i].l ;
int f = 0 ;
do{
int time = 0 ; // 上一架飞机的降落时间,在此事件后开始降落的飞机都是合法的
for(int i = 1 ; i <= n ; i ++)
{
int j = a[i] ;
if(time > g[j].t + g[j].d) break ; // 如果大于最晚到达时间则不合法
time = max(time , g[j].t) ; // 和飞机到达时间取max,
time += g[j].l ; // 当前飞机降落时间
if(i == n) f = 1 ; // 所有飞机都能降落
}
if(f) break ;
}while(next_permutation(a + 1 , a + 1 + n)) ; // n的全排列
cout << (f?"YES\n":"NO\n") ;
}
int main()
{
int t ; cin >> t ;
while(t --) solve() ;
return 0;
}