当前位置: 首页 > news >正文

【Complete Search】-基础完全搜索-Basic Complete Search

文章目录

  • Solution - Maximum Distance

涉及遍历整个解空间的问题

资料-resources

6 - Complete Search

在很多问题中(尤其是在 USACO Bronze 级别),只需检查解空间中的所有可能情况就足够了,比如所有元素、所有元素对、所有子集,或者所有排列。

毫不奇怪,这种方法被称为完全搜索(complete search)或暴力搜索(brute force),因为它会彻底遍历整个解空间。

问题-problem

Maximum Distance

Solution - Maximum Distance

我们可以遍历每一对点,并通过对欧几里得距离公式平方来计算它们之间的距离平方:

distance2[(x1,y1),(x2,y2)]=(x2−x1)2+(y2−y1)2\text{distance}^2\left[(x_1,y_1),(x_2,y_2)\right] = (x_2 - x_1)^2 + (y_2 - y_1)^2 distance2[(x1,y1),(x2,y2)]=(x2x1)2+(y2y1)2

将当前的最大距离平方值保存在变量 max_squared 中。

#include <bits/stdc++.h>
using namespace std;int main() {int n;cin >> n;vector<int> x(n), y(n);for (int &t : x) { cin >> t; }for (int &t : y) { cin >> t; }int max_squared = 0;                   // 存储当前最大距离平方for (int i = 0; i < n; i++) {          // 遍历每个第一个点for (int j = i + 1; j < n; j++) {  // 遍历每个第二个点(避免重复和自比较)int dx = x[i] - x[j];int dy = y[i] - y[j];int square = dx * dx + dy * dy;/** 如果两点距离的平方大于当前最大值,则更新最大值*/max_squared = max(max_squared, square);}}cout << max_squared << endl;
}

由于我们要遍历所有点对,因此让内层循环从 j=i+1j=i+1j=i+1 开始,确保点 iii 和点 jjj 永远不会是同一个点。另外,这样还能保证每一对点只被计算一次。

在这道题中,即使重复计算点对或允许 i=ji=ji=j 也不会影响最终结果(求最大距离),但在其他需要计数的问题中,避免重复计数非常重要。

题目要求输出的是任意两点之间最大欧几里得距离的平方。

有些同学可能想先用整数变量存储最大距离,然后最后再对结果进行平方。

但这里的问题是,两个整数点之间的距离平方一定是整数,但距离本身不一定是整数(可能是无理数或小数)。因此,如果先存储距离(非整数)到整数变量,会导致小数部分被截断,造成错误。

下面的解决方案使用浮点型变量来正确存储最大距离。

#include <bits/stdc++.h>
using namespace std;int main() {int n;cin >> n;vector<int> x(n), y(n);for (int &t : x) { cin >> t; }for (int &t : y) { cin >> t; }double max_dist = 0;for (int i = 0; i < n; i++) {for (int j = i + 1; j < n; j++) {int dx = x[i] - x[j];int dy = y[i] - y[j];int square = dx * dx + dy * dy;max_dist = max(max_dist, sqrt(square));}}cout << (int)pow(max_dist, 2) << endl;
}

但是,这段代码在以下测试用例上仍然会失败(它输出了 121212,而正确答案是 131313):

2
0 3
2 0

原因是浮点数计算的舍入误差导致的。虽然使用 (int) round(pow(max_dist, 2)) 进行四舍五入可以解决这个问题,但最重要的结论是:尽可能使用整数计算,避免浮点数误差。

http://www.dtcms.com/a/277023.html

相关文章:

  • 摩尔线程MUSA架构深度调优指南:从CUDA到MUSA的显存访问模式重构原则
  • Java: OracleHelper
  • Appium源码深度解析:从驱动到架构
  • Vue3 实现文件上传功能
  • HarmonyOS组件/模板集成创新活动-开发者工具箱
  • Vue配置特性(ref、props、混入、插件与作用域样式)
  • FusionOne HCI 23 超融合实施手册(超聚变超融合)
  • 第七章 算法题
  • NO.4数据结构数组和矩阵|一维数组|二维数组|对称矩阵|三角矩阵|三对角矩阵|稀疏矩阵
  • 电源中的声学-噪声,如何抑制开关电源的噪声
  • 飞算JavaAI:开启 Java 开发 “人机协作” 新纪元
  • 二叉树算法详解和C++代码示例
  • 项目合作复盘:如何把项目经验转化为可复用资产
  • 【C++】第十五节—一文详解 | 继承
  • ArkUI Inspector工具用法全解析
  • 【保姆级图文详解】Spring AI 中的工具调用原理解析,工具开发:文件操作、联网搜索、网页抓取、资源下载、PDF生成、工具集中注册
  • 在 JetBrains 系列 IDE(如 IntelliJ IDEA、PyCharm 等)中如何新建一个 PlantUML 文件
  • jEasyUI 创建带复选框的树形菜单
  • NLP-迁移学习
  • 【PyMuPDF】PDF图片处理过程内存优化分析
  • RHCIA第二次综合实验:OSPF
  • 电阻抗成像肺功能测试数据分析与直方图生成
  • 攻防世界——Web题 very_easy_sql
  • Rust 模块系统:控制作用域与私有性
  • python 虚拟环境 Anaconda Miniconda
  • 大模型的Temperature、Top-P、Top-K、Greedy Search、Beem Search
  • jeepay开源项目开发中金支付如何像其他支付渠道对接那样简单集成,集成服务商模式,极简集成工具。
  • AI驱动的软件工程(中):文档驱动的编码与执行
  • 深入解析 ArrayList
  • XGBoost三部曲:XGBoost原理