1.题目解析
2.算法原理
对于求方案数,判断方案是否合法,且题目的数量级不是很大时,我们优先考虑暴力枚举(DFS)
枚举出所有方案,判断其是否合法,进而找出题目答案
本题中就是安排飞机的降落顺序,枚举全排列方案。
我们可以从中间状态考虑,当枚举到第i架飞机时,考虑第i-1架飞机降落所消耗的时间time
如果time大于Ti+Di 则该方案不合法,反之合法
所以在设计dfs函数时,只需传入枚举位置和time即可
3.代码实现
#include<iostream>
using namespace std;
const int N = 1e5;
int T, n;
bool st[N]//st数组记录该飞机是否被枚举
struct plane//用结构体储存飞机信息
{
int t, d, l;
}p[N];
bool dfs(int u, int time)//u表示枚举位数,time 表示前一次飞机降落所需的时间
{
if (u == n)return true;
for (int i = 0; i < n; i++)//
{
if (!st[i])
{
if (time > p[i].t + p[i].d)//如果前一架飞机降落所需的时间大于当前飞机的停靠时间
{ //该方案不合法,返回上一层
return false;
}
int t = max(time, p[i].t) + p[i].l;//当前层所需的时间
st[i] = true;//已经枚举过了标记为true
if (dfs(u + 1, t))//如果枚举出的方案合法返回true
return true;
st[i] = false;//如果枚举出的方案不合法,回溯,将st数组标记为false
}
}
return false;//当枚举出所有方案后,没有合法的方案,返回flase
}
int main()
{
cin >> T;
while (T--)
{
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> p[i].t >> p[i].d >> p[i].l;
st[i] = false;//
}
if (dfs(0, 0))
cout << "YES" << endl;
else cout << "NO" << endl;
}
return 0;
}