14届蓝桥杯省赛 C/C++ B组 T4 飞机降落 (DFS)



记录此题提醒自己,此类时间轴问题可以通过DFS解决 DFS不是能解决所有题吗

对于此题,我们将降落的飞机的个数和时间轴作为DFS的形参,这样可以节省手动回溯的过程。

并且在DFS的过程中我们要加入一些贪心策略,否则直接爆搜有可能搜不出来答案。

如果一个飞机的到达时刻加上盘旋时间能够超过或者等于上一架飞机降落后的时间,那么就可以降落。

之后要再进行判断,如果这个飞机的到达时间是超过了上一架飞机降落后的时间的,那么就直接把t[i] + l[i]当作下一层的时间,否则的话,把上一个飞机降落的时间加上当前飞机降落的时间当做下一层的时间。

cpp 复制代码
#include<iostream>
#include<cstring>
using namespace std;
const int N = 15;

struct Node {
    int t;
    int d;
    int l;
}a[N];
int flag = 0;
int n;
bool vis[N];

void dfs(int u, int time) {
    if (flag)return;

    if (u == n) {
        flag = 1;
        return;
    }

    for (int i = 1; i <= n; i++) {
        if(!vis[i]){
            if(a[i].t + a[i].d >= time){
                vis[i] = 1;
                if(time > a[i].t)dfs(u+1,time + a[i].l);
                else dfs(u+1,a[i].t + a[i].l);
                vis[i] = 0;
            }
        }
    }
}

int main() {
    int t; cin >> t;

    while (t--) {
        memset(vis,0,sizeof vis);
        cin >> n;

        for (int i = 1; i <= n; i++)cin >> a[i].t >> a[i].d >> a[i].l;

        dfs(0,0);

        if (flag)cout << "YES" << endl;
        else cout << "NO" << endl;
        
        flag = 0;
    }
    return 0;
}
相关推荐
·薯条大王4 小时前
经济实惠玩云服务器|一台云服务器多人共用,子账号配置教程
java·linux·运维·服务器·汇编·c++·python
hansang_IR9 小时前
【题解】LC:倍增 / 区间并查集(Range Parallel Unionfind)
c++·算法·并查集
东东最爱敲键盘9 小时前
day7.c++继承
c++
沫璃染墨10 小时前
《从零入门Linux系统篇(十五):系统工具篇·六——GDB调试器详解:从程序执行控制到高级调试技巧》
linux·运维·服务器·c语言·c++
吃着火锅x唱着歌10 小时前
Effective C++ 学习笔记 条款40 明智而审慎地使用多重继承
c++·笔记·学习
醉城夜风~11 小时前
(超详细)C++ STL list容器详解:从使用方法到双向链表底层原理全面解析
c++·windows
烟花落o11 小时前
C++ 从 C 到进阶 ②:引用、inline 、nullptr
c++·引用·inline·nullptr·c++入门
liulilittle11 小时前
MOE路由:路由(logits: top-k/8)
c++·人工智能·算法·机器学习·llm
旖旎夜光11 小时前
LeetCode 11:盛最多水的容器(双指针问题) —— 题解
数据结构·c++·算法·leetcode·双指针
我不会插花弄玉14 小时前
15.map,set下:AVL树,红黑树和map,set的封装【由浅入深-C++】
c++·stl