数据量很小,直接爆搜
- #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;
- }

- #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;
- }
-