【2024.1.20练习】D: 飞机降落

2024-01-21 03:04
文章标签 练习 20 飞机 降落 2024.1

本文主要是介绍【2024.1.20练习】D: 飞机降落,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

D: 飞机降落(10分)

问题描述


我的代码:

#include <iostream>
#include <algorithm>
using namespace std;
const int max_n = 11;
int T;
int n;
int t[max_n];
int d[max_n];
int l[max_n];
bool f[max_n];
int v;int dfs(int t0, int n0) {if (t0 > t[n0] + d[n0]) {return 0;}if (t0 < t[n0]) {t0 = t[n0];}t0 += l[n0];v++;if (v == n + 1) {f[n0] = true;return 1;}f[n0] = true;for (int i = 1; i <= n; i++) {if (f[i] = false) {if (dfs(t0, i)) {return 1;}}}return 0;
}int main() {t[0] = 0;d[0] = 0;l[0] = 0;cin >> T;while (T--) {v = 0;cin >> n;for (int j = 0; j <= n; j++) {f[j] == false;}for (int i = 1; i <= n; i++) {cin >> t[i] >> d[i] >> l[i];}if (dfs(0,0)) {cout << "YES" << endl;}else {cout << "NO" << endl;}}return 0;
}

由于输入数量小,使用暴力搜索为O(10!)不会超时。

这段代码样例测试成功,但是无法通过。原因很简单,在递归函数中使用了全局变量的自增,内层递归结束进入前一层递归时,全局变量并不会回退成上一层的,不像递归函数参数具有回溯性。


修改后的代码:

#include <iostream>
#include <algorithm>
using namespace std;
const int max_n = 11;
int T;
int n;
int t[max_n];
int d[max_n];
int l[max_n];
bool f[max_n];
int v;int dfs(int t0, int n0, int v0) {if (t0 > t[n0] + d[n0]) {return 0;}//未通过if (t0 < t[n0]) {t0 = t[n0];}t0 += l[n0];//通过检测v0++;if (v0 == n + 1) {return 1;}for (int i = 1; i <= n; i++) {if (f[i] == false) {f[i] = true;if (dfs(t0, i, v0)) {return 1;}f[i] = false;}}return 0;
}int main() {t[0] = 0;d[0] = 0;l[0] = 0;cin >> T;while (T--) {v = 0;cin >> n;for (int j = 0; j <= n; j++) {f[j] = false;}for (int i = 1; i <= n; i++) {cin >> t[i] >> d[i] >> l[i];}if (dfs(0,0,0)) {cout << "YES" << endl;}else {cout << "NO" << endl;}}return 0;
}

找了2小时Bug。终于改好了QWQ


标准代码:

#include <iostream>
#include <algorithm>using namespace std;
const int N = 10;
bool st[N];
int n;
bool flag = false;
int t[N], d[N], l[N];void dfs(int u, int last) {if (flag) return;if (u == n) {flag = true;return;}for (int i = 0; i < n; i++) {if (!st[i]) {if (t[i] + d[i] >= last) {st[i] = true;if (t[i] > last) dfs(u + 1, t[i] + l[i]);else dfs(u + 1, last + l[i]);st[i] = false;} else return;}}
}int main() {int T;cin >> T;while (T--) {cin >> n;for (int i = 0; i < n; i++) cin >> t[i] >> d[i] >> l[i];for (int i = 0; i < N; i++) st[i] = false;flag = false;dfs(0, 0);if (flag) cout << "YES" << endl;else cout << "NO" << endl;}return 0;
}

相比我的代码更加简洁。

这篇关于【2024.1.20练习】D: 飞机降落的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/628170

相关文章

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

RabbitMQ练习(AMQP 0-9-1 Overview)

1、What is AMQP 0-9-1 AMQP 0-9-1(高级消息队列协议)是一种网络协议,它允许遵从该协议的客户端(Publisher或者Consumer)应用程序与遵从该协议的消息中间件代理(Broker,如RabbitMQ)进行通信。 AMQP 0-9-1模型的核心概念包括消息发布者(producers/publisher)、消息(messages)、交换机(exchanges)、

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

【Rust练习】12.枚举

练习题来自:https://practice-zh.course.rs/compound-types/enum.html 1 // 修复错误enum Number {Zero,One,Two,}enum Number1 {Zero = 0,One,Two,}// C语言风格的枚举定义enum Number2 {Zero = 0.0,One = 1.0,Two = 2.0,}fn m

MySql 事务练习

事务(transaction) -- 事务 transaction-- 事务是一组操作的集合,是一个不可分割的工作单位,事务会将所有的操作作为一个整体一起向系统提交或撤销请求-- 事务的操作要么同时成功,要么同时失败-- MySql的事务默认是自动提交的,当执行一个DML语句,MySql会立即自动隐式提交事务-- 常见案例:银行转账-- 逻辑:A给B转账1000:1.查询

【JavaScript】LeetCode:16-20

文章目录 16 无重复字符的最长字串17 找到字符串中所有字母异位词18 和为K的子数组19 滑动窗口最大值20 最小覆盖字串 16 无重复字符的最长字串 滑动窗口 + 哈希表这里用哈希集合Set()实现。左指针i,右指针j,从头遍历数组,若j指针指向的元素不在set中,则加入该元素,否则更新结果res,删除集合中i指针指向的元素,进入下一轮循环。 /*** @param

html css jquery选项卡 代码练习小项目

在学习 html 和 css jquery 结合使用的时候 做好是能尝试做一些简单的小功能,来提高自己的 逻辑能力,熟悉代码的编写语法 下面分享一段代码 使用html css jquery选项卡 代码练习 <div class="box"><dl class="tab"><dd class="active">手机</dd><dd>家电</dd><dd>服装</dd><dd>数码</dd><dd

014.Python爬虫系列_解析练习

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈 入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈 虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈 PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)文章合集 👈👈 Oracle数据库教程:👉👉 Oracle数据库文章合集 👈👈 优

如何快速练习键盘盲打

盲打是指在不看键盘的情况下进行打字,这样可以显著提高打字速度和效率。以下是一些练习盲打的方法: 熟悉键盘布局:首先,你需要熟悉键盘上的字母和符号的位置。可以通过键盘图或者键盘贴纸来帮助记忆。 使用在线打字练习工具:有许多在线的打字练习网站,如Typing.com、10FastFingers等,它们提供了不同难度的练习和测试。 练习基本键位:先从学习手指放在键盘上的“家位”开始,通常是左手的

anaconda3下的python编程练习-csv翻译器

相关理解和命令 一、环境配置1、conda命令2、pip命令3、python命令 二、开发思路三、开发步骤 一、环境配置 1、conda命令 镜像源配置 conda config --show channels //查看镜像源conda config --remove-key channels //删除添加源,恢复默认源#添加镜像源conda config --ad