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

2025-10-8模拟测验

结果:\(\texttt{90 + 100 + 80 + 90 = 360 pts, rank 2}\)

T1 HYH的线段

算法:计算几何(?)。

描述

HYH 第一类平面是一个无穷大的平面,另外 HYH 同学在平面上作出两条线段 \(AB\)\(CD\)

HYH 同学发现,两条线段可能相交,也可能不相交。HYH 同学觉得好神奇哦!所以他想要知道,两条线段的距离是多少。

线段 \(AB\)\(CD\) 的距离定义为,线段 \(AB\) 上的点 \(P\) 和线段 \(CD\) 上的点 \(Q\)(均可与线段端点重合)的连线 \(PQ\) 长度的最小值。

现在给定两条线段的端点坐标,要求计算线段的距离。

输入

输入只有四行,每行两个整数(在 \([-100,100]\) 内),分别表示点 \(A,B,C,D\) 的坐标。

输出

输出只有一个四位小数,表示线段 \(AB\)\(CD\) 的距离。

样例

\(1\) 组,不包含大样例。

样例 \(1\) 输入

0 5
0 4
-1 0
1 0

样例 \(1\) 输出

4.0000

题解

首先,对于线段相交的情况,直接输出 \(0.0000\) 即可。

反之,我们写一个函数,用于求出点到线段的最小距离。显然,这个距离要么是垂线(如果可以),要么与某个端点相连。

而不相交的情况下,我们只需要对于两条线段的四个端点分别计算到另一条线段的距离,然后四个距离取最小值即可。

但是垂线、平行等情况有可能出现除 \(0\) 导致 RE,所以要大力分讨一下。

#include<bits/stdc++.h>
#define y1 y_1
using namespace std;
inline double dis(double x1, double y1, double x2, double y2){return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
inline double dtoxd(double x1, double y1, double xax1, double xay1, double xbx1, double xby1){if(xax1 == xbx1){if(min(xay1, xby1) <= y1 && y1 <= max(xay1, xby1)){return fabs(xax1 - x1);}return min(dis(x1, y1, xax1, xay1), dis(x1, y1, xbx1, xby1));}else{double k = (xay1 - xby1) / (xax1 - xbx1);double b = xay1 - k * xax1;if(!k){if(min(xax1, xbx1) <= x1 && x1 <= max(xax1, xbx1)){return fabs(xay1 - y1);}return min(dis(x1, y1, xax1, xay1), dis(x1, y1, xbx1, xby1));}else{double czk = -1.0 / k;double czb = y1 - czk * x1;double x0 = (b-czb) / (czk-k);double y0 = k * x0 + b;if(min(xay1, xby1) <= y0 && y0 <= max(xay1, xby1)){return dis(x1, y1, x0, y0);}}}return min(dis(x1, y1, xax1, xay1), dis(x1, y1, xbx1, xby1));
}
double a1x, a1y, b1x, b1y, c1x, c1y, d1x, d1y;
inline double fab(double x){if(a1x == b1x) return 101;double k = (a1y - b1y) / (a1x - b1x);double b = a1y - k * a1x;return k * x + b;
}
inline double fcd(double x){if(c1x == d1x) return 101;double k = (c1y - d1y) / (c1x - d1x);double b = c1y - k * c1x;return k * x + b;
}
inline bool cross(){// cout << a1x << " " << b1x << endl;if(a1x == b1x){return min(a1y, b1y) <= fcd(a1x) && fcd(a1x) <= max(a1y, b1y);}// cout << "Here1";// cout<<fab(b1x) - fcd(b1x);exit(0);double cross1 = (fab(a1x) - fcd(a1x)) * (fab(b1x) - fcd(b1x));double cross2 = (fab(c1x) - fcd(c1x)) * (fab(d1x) - fcd(d1x));// cout << cross1 << " " << cross2 << endl;// if(!cross1 || ! cross2){//     // cout << "duandian" << endl;//     return true;// }return cross1 <= 0 && cross2 <= 0;
}
// inline void Print(){
//     cout << a1x << " " << a1y << endl;
//     cout << b1x << " " << b1y << endl;
//     cout << c1x << " " << c1y << endl;
//     cout << d1x << " " << d1y << endl;
//     return;
// }
signed main(){// freopen("segment.in", "r", stdin);// freopen("segment.out", "w", stdout);cin >> a1x >> a1y;cin >> b1x >> b1y;cin >> c1x >> c1y;cin >> d1x >> d1y;// cout << "kkkkk";exit(0);if(a1x == b1x && c1x == d1x){if(min(a1y, b1y) <= c1y && c1y <= max(a1y, b1y)){cout << fixed << setprecision(4) << fabs(a1x-c1x) << '\n';}else if(min(a1y, b1y) <= d1y && d1y <= max(a1y, b1y)){cout << fixed << setprecision(4) << fabs(a1x-c1x) << '\n';}else{// Print();// cout << dis(1, 4, -1, 3) << endl;exit(0);double ans = min({dis(a1x, a1y, c1x, c1y)  ,dis(a1x, a1y, d1x, d1y)  ,dis(b1x, b1y, c1x, c1y)  ,dis(b1x, b1y, d1x, d1y)});cout << fixed << setprecision(4) << ans << '\n';}return 0;}if(c1x == d1x){swap(a1x, c1x), swap(a1y, c1y);swap(b1x, d1x), swap(b1y, d1y);}if(cross()){cout << "0.0000" << '\n';return 0;}// Print();// cout << dtoxd(a1x, a1y, c1x, c1y, d1x, d1y) << endl;// cout << dtoxd(b1x, b1y, c1x, c1y, d1x, d1y) << endl;// cout << dtoxd(c1x, c1y, a1x, a1y, b1x, b1y) << endl;// cout << dtoxd(d1x, d1y, a1x, a1y, b1x, b1y) << endl;// cout << "jbjbjb";double ans = min({dtoxd(a1x, a1y, c1x, c1y, d1x, d1y)  ,dtoxd(b1x, b1y, c1x, c1y, d1x, d1y)  ,dtoxd(c1x, c1y, a1x, a1y, b1x, b1y)  ,dtoxd(d1x, d1y, a1x, a1y, b1x, b1y)});cout << fixed << setprecision(4) << ans << '\n';return 0;
}
http://www.hskmm.com/?act=detail&tid=26786

相关文章:

  • QBXT2025S刷题 Day7
  • 【Python】调用C++
  • 方法作业
  • [100ask_imx6ullpro] buildroot构建emmc镜像并烧录
  • 2025 汽车改装公司最新推荐榜:一站式服务生态企业盘点,含奔驰宝马新能源改装及新锐品牌权威测评重庆宝马汽车改装/重庆新能源汽车改装/重庆汽车改装贴膜/重庆汽车改装轮毂刹车公司推荐
  • 2025 布袋包装厂家最新推荐榜:自贸区实力厂商领衔,含手提袋、帆布袋等全品类,年销 500 万级生产商精选无纺布袋/布袋生产/云南布袋包装/茶叶布袋厂家推荐
  • 2025 年成型机厂家最新推荐排行榜:冷弯 / 光伏支架 / 门业 / 建材等领域设备企业精度与耐用性实测点评魔方方管/门框角码/导槽/底樑/光伏支架/C型钢成型机厂家推荐
  • 2025 年平板机厂家最新推荐榜单:聚焦技术实力与市场口碑,5 大优质品牌实测点评
  • 语音识别与合成的融合技术解析
  • 2025 年阳光导入源头厂家最新推荐榜:领军企业技术实力、案例与直销模式深度解析及选择指南工厂/学校/医院/地下车库/隧道阳光导入系统厂家推荐
  • 从Node.js到React/Vue3:流式输出实用的技术的全栈实现指南
  • 用低成本FPGA实现FSMC接口的多串口(UART)控制器
  • 2025 火烧板源头厂家最新推荐榜单:自有矿山保障品质,高硬度耐磨产品全覆盖,五莲花 / 芝麻白 / 防滑芝麻黑采购优选指南
  • 2025 年太阳能路灯厂商最新推荐榜:聚焦优质企业,从技术实力到合作案例全方位解析太阳能道路灯/景观灯/警示灯/庭院灯/草坪灯/杀虫灯厂家推荐
  • 2025 年最新软件开发机构推荐排行榜:涵盖 CRM / 物联网 / 运维管理等系统定制的权威甄选指南成都软件开发/软件定制开发/crm系统定制软件开发机构推荐
  • Luogu P11660 我终将成为你的倒影 题解 [ 紫 ] [ 分块 ] [ 分类讨论 }
  • 2025 年最新推荐!小程序开发机构排行榜:覆盖定制开发 / 电商 / 预订 / 配送多场景优质服务商成都小程序开发/小程序定制开发/电商小程序开发/预订服务小程序开发公司推荐
  • CF280D k-Maximum Subsequence Sum 题解(线段树+反悔贪心维护k段最大子段和)
  • 2025 西安新房住宅最新推荐榜权威发布:多维度测评 + 选房指南,助你精准置业品质/高端/优质/品牌/刚需新房推荐
  • C# async await 测试一
  • 2025 年快速卷帘门厂家最新推荐排行榜:聚焦智能定制与高效供货,精选实力厂家助您精准选购
  • 实验课1
  • 课后作业1
  • 详细介绍:Windows如何定制键盘按键
  • 深入解析:Oracle、PostgreSQL 与 MySQL 数据库对比分析与实践指南
  • TheHackersLabs Templo writeup
  • PCIe扫盲——链路初始化与训练基础(三)之LTSSM
  • #attrs
  • 国庆比赛总结
  • 记录第一个博客