洛谷解题日记||基础篇3

#include <iostream>
#include <iomanip>  // 用于设置输出格式
using namespace std;double a, b, c, d;// 定义方程 f(x) = ax^3 + bx^2 + cx + d
double fc(double x) {return a * x * x * x + b * x * x + c * x + d;
}int main() {double l, r, m, x1, x2;int s = 0;// 输入系数 a, b, c, dcin >> a >> b >> c >> d;// 循环遍历区间 [-100, 100]for (int i = -100; i < 100; i++) {l = i; r = i + 1;x1 = fc(l); x2 = fc(r);// 如果左端点是根,直接输出if (x1 == 0) {cout << fixed << setprecision(2) << l << " ";s++;}// 判断区间内是否有根if (x1 * x2 < 0) {// 使用二分法找到根while (r - l >= 0.001) {m = (l + r) / 2;  // 计算中点if (fc(m) * fc(r) <= 0)l = m;elser = m;   // 缩小区间}cout << fixed << setprecision(2) << r << " ";s++;}// 如果已经找到3个根,则退出if (s == 3)break;}return 0;
}

 遍历区间,寻找零点

    // 循环遍历区间 [-100, 100]for (int i = -100; i < 100; i++) {l = i; r = i + 1;x1 = fc(l); x2 = fc(r);

  • for (int i = -100; i < 100; i++):循环遍历区间 [−100,100],每次选择一个整数区间 [i,i+1]
  • l = i; r = i + 1;:设置当前的区间为 [i,i+1]
  • x1 = fc(l); x2 = fc(r);:计算区间两端点的函数值 f(l) f(r)

判断区间内是否有根,使用二分法逼近 

        // 判断区间内是否有根if (x1 * x2 < 0) {// 使用二分法找到根while (r - l >= 0.001) {m = (l + r) / 2;  // 计算中点if (fc(m) * fc(r) <= 0)l = m;elser = m;   // 缩小区间}cout << fixed << setprecision(2) << r << " ";s++;}

  • if (x1 * x2 < 0):如果区间端点的符号相反,即 f(l) f(r) 的乘积小于 0,说明区间内有根。根据 中值定理,如果一个连续函数在区间的两端有不同的符号,那么区间内必定存在一个根。

  • while (r - l >= 0.001):使用二分法缩小区间,直到区间的宽度小于 0.001。这里 0.001 是控制精度的阈值。

  • m = (l + r) / 2;:计算区间的中点 m

  • if (fc(m) * fc(r) <= 0):检查中点和右端点的函数值符号,如果符号相反,根在左半区间,将左端点更新为中点 l = m;否则,根在右半区间,将右端点更新为中点 r = m

  • cout << fixed << setprecision(2) << r << " ";:输出右端点(即当前区间的一个近似根),保留两位小数。

  • s++:增加根计数器。


 

这个问题的核心思想是通过计算每个士兵的路径上经过的最大伤害值来安排士兵的行进路线,最终我们需要找到最小的最大伤害代价。换句话说,我们希望找到一种路径,使得所有士兵的最大伤害值最小。

思路:

  1. 问题转化为路径的最大值问题

    • 每个士兵从第 1 行任意一个单元格出发,最终到达第 n 行的每个单元格。每个士兵的路径是从上到下的,路径上经过的最大伤害值决定了这个士兵的伤害值。
    • 我们希望通过合理分配路径,找出所有路径中的“最大伤害值”中的最小值。
  2. 关键分析

    • 由于我们关心的是路径上的最大伤害值,因此可以将问题转化为:对于一个给定的最大伤害值 xxx,判断是否可以找到一种方式,使得所有的士兵从第 1 行到达第 n 行,同时路径上的最大伤害值都不超过 xxx。
    • 这个问题可以通过 二分法 进行优化,搜索最小的最大伤害值。
  3. 二分法+BFS/DFS判断可行性

    • 使用二分法确定可能的最小最大伤害值。
    • 对于每个中间值 xxx,通过广度优先搜索(BFS)或者深度优先搜索(DFS)来判断从第 1 行到第 n 行是否可以找到一条路径,路径上的最大伤害值不超过 xxx。
    • 如果可以找到路径,说明当前伤害值是可行的,继续尝试更小的值;否则,增加伤害值。

解法步骤:

  1. 初始化

    • 读取输入,并建立一个 n×m 的伤害矩阵 p
  2. 二分查找

    • 设置伤害值的搜索范围为 0max(p),然后进行二分查找。
  3. 广度优先搜索(BFS)判断可行性

    • 对于每个中间值 xxx,我们用 BFS 检查从第 1 行到第 n 行是否存在路径,并且路径上的最大伤害值不超过 xxx。
  4. 输出最小的最大伤害值

代码实现:

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>using namespace std;struct Point {int x, y;
};int n, m;
vector<vector<int>> p;  // 储存伤害值
vector<vector<bool>> visited;bool canReach(int maxDamage) {queue<Point> q;visited.assign(n, vector<bool>(m, false));// 将第 1 行的所有位置加入队列for (int j = 0; j < m; ++j) {if (p[0][j] <= maxDamage) {q.push({0, j});visited[0][j] = true;}}// 四个方向:上、下、左、右int dirs[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};while (!q.empty()) {Point cur = q.front();q.pop();// 如果到了最后一行,说明找到了一条有效路径if (cur.x == n - 1) {return true;}// 探索相邻的四个方向for (auto& dir : dirs) {int nx = cur.x + dir[0], ny = cur.y + dir[1];if (nx >= 0 && nx < n && ny >= 0 && ny < m && !visited[nx][ny] && p[nx][ny] <= maxDamage) {visited[nx][ny] = true;q.push({nx, ny});}}}return false;
}int main() {cin >> n >> m;p.resize(n, vector<int>(m));// 读入伤害矩阵for (int i = 0; i < n; ++i) {for (int j = 0; j < m; ++j) {cin >> p[i][j];}}// 二分查找最小的最大伤害值int left = 0, right = 1000; // 最大伤害值范围为 [0, 1000]int answer = right;while (left <= right) {int mid = left + (right - left) / 2;if (canReach(mid)) {answer = mid;right = mid - 1;  // 尝试找到更小的最大伤害值} else {left = mid + 1;  // 增加最大伤害值}}cout << answer << endl;return 0;
}

代码解释:

  1. 输入读取

    • 通过 cin 读取迷阵的大小和伤害值矩阵。
  2. canReach 函数

    • 给定一个最大伤害值 maxDamage,通过 BFS 判断是否可以找到一条从第 1 行到第 n 行的路径,使得路径上所有房间的伤害值都不超过 maxDamage
    • 如果找到路径,返回 true,否则返回 false
  3. 二分查找

    • 我们对伤害值进行二分查找,初始范围为 [0, 1000],中间值 mid 表示当前尝试的最大伤害值。
    • 对于每个中间值,使用 canReach 函数检查是否可行。如果可行,尝试找到更小的最大伤害值,否则增加伤害值。
  4. 输出结果

    • 最终的 answer 是最小的最大伤害值,即部队受到的最小伤害代价。

 

 

#include<iostream> // 包含输入输出流库
using namespace std; // 使用标准命名空间// 二进制幂取模函数
// a: 底数
// b: 指数
// p: 模数
long long binpow(long long a, long long b, long long p) {long long res = 1; // 初始化结果为1while(b > 0) { // 当指数大于0时循环if(b & 1) // 如果当前指数的最低位是1res = (res * a) % p; // 更新结果a = (a * a) % p; // 更新底数b >>= 1; // 指数右移一位,相当于除以2}return res; // 返回最终结果
}int main() {long long a, b, p; // 定义长整型变量a, b, pcin >> a >> b >> p; // 从标准输入读取a, b, p的值// 输出a的b次幂取p的模的结果cout << a << "^" << b << " mod " << p << "=" << binpow(a, b, p) << endl;return 0; // 程序正常结束
}


 

#include<iostream>
#include<vector>
#include<string>
using namespace std;// 递归函数:将整数n转化为2的幂次方的表示
string powering(int n) {// 基本情况:当 n 为 0 时,返回 "0"if (n == 0) return "0";// 用来存储所有二进制位为1的幂次方vector<int> powers;// 遍历二进制位,找出所有为1的位for (int i = 0; (1 << i) <= n; i++) {if (n & (1 << i)) {  // 判断第 i 位是否为 1powers.push_back(i);  // 如果为 1,则记录该位的幂次方}}// 用于存储最终的结果表达式string result = "";// 从高位开始处理幂次方for (int i = powers.size() - 1; i >= 0; i--) {int power = powers[i];  // 获取当前的幂次方if (power == 0) {// 对于 2^0,直接用 "2(0)" 表示result += "2(0)";} else if (power == 1) {// 对于 2^1,直接用 "2" 表示result += "2";} else {// 对于大于 2^1 的幂次方,递归调用powering生成子表达式result += "2(" + powering(power) + ")";}// 如果当前不是最后一个幂次方,加上加号 "+"if (i > 0) {result += "+";}}// 返回生成的表达式return result;
}int main() {int n;cin >> n;  // 输入一个正整数 ncout << powering(n) << endl;  // 调用 powering 函数生成并输出结果return 0;
}

    vector<int> powers;  // 用于存储二进制表示中为1的所有幂for (int i = 0; (1 << i) <= n; ++i) {if (n & (1 << i)) {powers.push_back(i);}}
  • 这里我们声明一个 vector<int> powers,用来存储二进制表示中每一位为 1 的幂次方。
  • for (int i = 0; (1 << i) <= n; ++i):这个循环通过位移操作逐步检查整数 n 的每一位。如果当前位对应的 2 的幂小于等于 n,就继续检查下一位。
    • (1 << i) 是将 1 左移 i 位,等价于计算 2^i。
    • n & (1 << i) 是进行位与操作,如果该位为 1,说明 n 在二进制中该位是 1
  • 如果某一位为 1,我们将 i (表示当前的幂次方)加入 powers 向量中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/12162.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

软件测试学习记录 Day1

根据黑马程序员最新版的软件测试课程所做的笔记&#xff0c;需要原件后台私信&#xff1a; 练习提取测试点&#xff1a; 博主的答案&#xff0c;有不一样看法的可评论区讨论&#xff1a;

代码随想录刷题记录(二十七)——55. 右旋字符串

&#xff08;一&#xff09;问题描述 55. 右旋字符串&#xff08;第八期模拟笔试&#xff09;https://kamacoder.com/problempage.php?pid1065字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k&#xff0c;请编写一个函数&…

FreeRTOS 24:事件组EventGroup等待、清零、获取操作

等待事件标志位xEventGroupWaitBits() 既然标记了事件的发生&#xff0c;那么我怎么知道他到底有没有发生&#xff0c;这也是需要一个函数来获 取 事 件 是 否 已 经 发 生 &#xff0c; FreeRTOS 提 供 了 一 个 等 待 指 定 事 件 的 函 数 — — xEventGroupWaitBits()&…

信息安全数学基础(47)域的结构

一、域的定义 设F为一个非空集合&#xff0c;在其上定义两种运算&#xff1a;加法和乘法。如果这两种运算在集合上封闭&#xff0c;且满足以下条件&#xff0c;则称F对于规定的乘法和加法构成一个域&#xff1a; F中所有元素对于加法形成加法交换群&#xff0c;即加法满足交换律…

#渗透测试#SRC漏洞挖掘#CSRF漏洞的防御

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

HarmonyOS 沉浸式状态实现的多种方式

1. HarmonyOS 沉浸式状态实现的多种方式 HarmonyOS 沉浸式状态实现的多种方式 1.1. 方法一 1.1.1. 实现讲解 &#xff08;1&#xff09;首先设置setWindowLayoutFullScreen(true)&#xff08;设置全屏布局&#xff09;。   布局将从屏幕最顶部开始到最底部结束&#xff0c…

在API接口数据获取过程中,如何确保数据的安全性和隐私性?

在API接口数据获取过程中&#xff0c;确保数据的安全性和隐私性至关重要。以下是一些关键措施&#xff0c;可以帮助开发者和管理者保护API接口的数据安全和隐私性&#xff1a; 身份认证和授权 身份认证&#xff1a;确认用户身份的过程&#xff0c;常用的身份认证方式包括用户…

C++常用的特性-->day05

友元的拓展语法 声明一个类为另外一个类的友元时&#xff0c;不再需要使用class关键字&#xff0c;并且还可以使用类的别名&#xff08;使用 typedef 或者 using 定义&#xff09;。 #include <iostream> using namespace std;// 类声明 class Tom; // 定义别名 using …

python-27-Python ORM系列之彻底搞明白ORM概念,对ORM进行封装结合FastAPI实现数据库的增删改查,联表查询等接口

python-27-Python ORM系列之彻底搞明白ORM概念&#xff0c;对ORM进行封装结合FastAPI实现数据库的增删改查&#xff0c;联表查询等接口 一.简介 在Python基础系列ORM部分为大家介绍了如何搭建MySQL数据和MySQL一些访问配置&#xff0c;同时也介绍了pymysql库的封装来实现对数…

从哈佛哲学系到蛋白质设计大师,David Baker:AlphaFold令我深刻认识到深度学习的力量

要说谁是引领蛋白质设计的世界级大师&#xff0c;美国华盛顿大学的 David Baker 教授可谓是当之无愧&#xff0c;作为该领域的顶级专家&#xff0c;Baker 在蛋白质方向发表研究论文 700 余篇&#xff0c;引用量累计超 17.7 万。今年 10 月&#xff0c;因其在蛋白质设计方面的卓…

【测试框架篇】单元测试框架pytest(2):用例编写

一、 前言 前面一章我们介绍了pytest环境安装和配置&#xff0c;并在pycharm里面实现了我们第一个pytest脚本。但是有些童鞋可能在编写脚本的时候遇到了问题&#xff0c;本文会讲一下我们编写pytest用例时需要遵守哪些既定的规则&#xff0c;同时这个规则也是可以修改的。 二…

实现LiDAR和多视角摄像头数据的对齐、可控X-DRIVE:用于驾驶场景的跨模态一致多传感器数据合成

Abstract 近年来&#xff0c;扩散模型在合成驾驶场景中的LiDAR点云或摄像头图像数据方面取得了进展。尽管这些模型在单一模态数据的边际分布建模方面取得成功&#xff0c;但对不同模态之间互相依赖关系的探索仍然不足&#xff0c;而这种依赖关系能够更好地描述复杂的驾驶场景。…

稳恒磁场(1)

物理概念 磁场是物质性的。 地磁场&#xff08;与地磁场正负极相反&#xff09;与磁偏角&#xff08;一般为0到11度&#xff09; 磁感应强度&#xff1a; 单位为特斯拉&#xff08;T&#xff09;&#xff0c;另一个常用单位是高斯&#xff08;G&#xff09;且1T 10^4 G 物…

自动驾驶系列—自动驾驶中的短距离感知:超声波雷达的核心技术与场景应用

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

多语言爬取淘宝价格信息 python 比价api接入指南

以下是爬取淘宝价格信息及接入淘宝比价 API 的一般步骤&#xff1a; 传统爬虫方式获取价格信息&#xff08;不建议大量使用&#xff0c;可能违反淘宝规定&#xff09;&#xff1a; 分析目标页面 URL&#xff1a;在淘宝搜索框输入关键词后&#xff0c;观察页面的 URL 结构。例如…

Java List——针对实习面试

目录 Java ListJava List的三种主要实现是什么&#xff1f;它们各自的特点是什么&#xff1f;Java List和Array&#xff08;数组&#xff09;的区别&#xff1f;Java List和Set有什么区别&#xff1f;ArrayList和Vector有什么区别&#xff1f;什么是LinkedList&#xff1f;它与…

如何在Linux系统中安装微信

官方版微信的安装 好消息是&#xff0c;现在微信已经发布了官方的Linux版本&#xff0c;大家可以直接通过官方网站下载并安装&#xff0c;避免了以前繁琐的第三方工具安装步骤。 1.1 下载官方版微信 微信&#xff0c;是一个生活方式 选择Linux-> X86 1.2 安装微信 提前…

java双向链表解析实现双向链表的创建含代码

双向链表 一.双向链表二.创建MyListCode类实现双向链表创建一.AddFirst创建&#xff08;头插法&#xff09;二.AddLast创建&#xff08;尾叉法&#xff09;三.size四.remove(指定任意节点的首位删除)五.removeAll(包含任意属性值的所有删除)六.AddIndex(给任意位置添加一个节点…

hhdb数据库介绍(2-2)

数据高可用服务 HHDB Server在计算节点、数据节点、配置库等层次提供全面的高可用保障。提供完善的心跳检测、故障切换对存储节点同步追平判断、全局自增序列在故障时自动跳号、客户端连接Hold等机制&#xff0c;保障数据服务的可用性与数据的一致性。 计算节点服务高可用 H…

精挑细选的100道软测高频面试题,面试前你肯定用得上

测试技术面试题 1、什么是兼容性测试&#xff1f;兼容性测试侧重哪些方面&#xff1f; 2、我现在有个程序&#xff0c;发现在 Windows 上运行得很慢&#xff0c;怎么判别是程序存在问题还是软硬件系统存在问题&#xff1f; 3、测试的策略有哪些&#xff1f; 4、正交表测试用…