2020杭电多校第三场 Triangle Collision(计算几何,坐标翻转,镜像对称)

本文主要是介绍2020杭电多校第三场 Triangle Collision(计算几何,坐标翻转,镜像对称),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题意:
一个小球在一个等边三角形内碰撞,碰撞速度不比,方向沿边镜像翻折。求发送 k k k次碰撞需要多少时间

思路:
一开始想着是模拟,然后估摸着最后会形成循环,经过起始点。但是太难模拟了。。

看了题解发现,真的特别巧妙。反射意味着穿过!那么就成了全是等边三角形铺成的平面,已知起点和速度。求经过 k k k条边的最短时间。

这个时间可以二分。

仅考虑平行x轴的边,那就直接用 a b s ⌊ y h ⌋ abs\lfloor \frac{y}{h} \rfloor abshy即可(-0.5向下取整是-1,同样适用)。

对于左右两条边,我们则需要将终点坐标翻转再算。
因为左右两条边一开始都不经过源点,所以我们要将终点翻转后的纵坐标向上平移 h 2 \frac{h}{2} 2h,使得左右边为底边,这样就和原来平行x轴的边算法一样了。(看题解的时候,这里纠结了好久┭┮﹏┭┮)

平面坐标翻转:https://blog.csdn.net/sinat_33425327/article/details/78333946

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cmath>using namespace std;typedef long long ll;
const int maxn = 205;
const double PI = acos(-1);
const double base = 2 * PI / 3;double L,x,y,vx,vy,h;
int k;struct Point {double x,y;Point(){}Point(double x,double y) {this -> x = x;this -> y = y;}
};Point Rotate(Point a,double rad) { //坐标逆时针变换return Point(a.x * cos(rad) - (a.y) * sin(rad),a.x * sin(rad) + (a.y) * cos(rad));
}bool check(double t) {ll num = 0;Point now = Point(x + t * vx,y + t * vy);Point p1 = Rotate(now, base * 0);num += abs(floor(p1.y / h));Point p2 = Rotate(now, base * 1);p2.y += h / 2;// 以右边为平行x轴,则需向上平行h/2使得其经过源点,相当于三角形左移h/2num += abs(floor(p2.y / h));Point p3 = Rotate(now, base * 2);p3.y += h / 2;// 同上num += abs(floor(p3.y / h));return num >= k;
}int main() {int T;scanf("%d",&T);while(T--) {scanf("%lf%lf%lf%lf%lf%d",&L,&x,&y,&vx,&vy,&k);h = sqrt(3) / 2 * L;double l = 0,r = 1e11;while(r - l > 1e-6) {double mid = (l + r) / 2;if(check(mid)) {r = mid;} else {l = mid;}}printf("%.10f\n",(l + r) / 2);}return 0;
}

这篇关于2020杭电多校第三场 Triangle Collision(计算几何,坐标翻转,镜像对称)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

docker 重命名镜像的实现方法

《docker重命名镜像的实现方法》在Docker中无法直接重命名镜像,但可通过添加新标签、删除旧镜像后重新拉取/构建,或在DockerCompose中修改配置文件实现名称变更,感兴趣的可以了解一下... 目录使用标签(Tagging)删除旧的php镜像并重新拉取或构建使用docker Compose在Do

linux配置podman阿里云容器镜像加速器详解

《linux配置podman阿里云容器镜像加速器详解》本文指导如何配置Podman使用阿里云容器镜像加速器:登录阿里云获取专属加速地址,修改Podman配置文件并移除https://前缀,最后拉取镜像... 目录1.下载podman2.获取阿里云个人容器镜像加速器地址3.更改podman配置文件4.使用po

Docker多阶段镜像构建与缓存利用性能优化实践指南

《Docker多阶段镜像构建与缓存利用性能优化实践指南》这篇文章将从原理层面深入解析Docker多阶段构建与缓存机制,结合实际项目示例,说明如何有效利用构建缓存,组织镜像层次,最大化提升构建速度并减少... 目录一、技术背景与应用场景二、核心原理深入分析三、关键 dockerfile 解读3.1 Docke

Python一次性将指定版本所有包上传PyPI镜像解决方案

《Python一次性将指定版本所有包上传PyPI镜像解决方案》本文主要介绍了一个安全、完整、可离线部署的解决方案,用于一次性准备指定Python版本的所有包,然后导出到内网环境,感兴趣的小伙伴可以跟随... 目录为什么需要这个方案完整解决方案1. 项目目录结构2. 创建智能下载脚本3. 创建包清单生成脚本4

Python实现精确小数计算的完全指南

《Python实现精确小数计算的完全指南》在金融计算、科学实验和工程领域,浮点数精度问题一直是开发者面临的重大挑战,本文将深入解析Python精确小数计算技术体系,感兴趣的小伙伴可以了解一下... 目录引言:小数精度问题的核心挑战一、浮点数精度问题分析1.1 浮点数精度陷阱1.2 浮点数误差来源二、基础解决

Python文本相似度计算的方法大全

《Python文本相似度计算的方法大全》文本相似度是指两个文本在内容、结构或语义上的相近程度,通常用0到1之间的数值表示,0表示完全不同,1表示完全相同,本文将深入解析多种文本相似度计算方法,帮助您选... 目录前言什么是文本相似度?1. Levenshtein 距离(编辑距离)核心公式实现示例2. Jac

Python中经纬度距离计算的实现方式

《Python中经纬度距离计算的实现方式》文章介绍Python中计算经纬度距离的方法及中国加密坐标系转换工具,主要方法包括geopy(Vincenty/Karney)、Haversine、pyproj... 目录一、基本方法1. 使用geopy库(推荐)2. 手动实现 Haversine 公式3. 使用py

Conda国内镜像源及配置过程

《Conda国内镜像源及配置过程》文章介绍Conda镜像源使用方法,涵盖临时指定单个/多个源、永久配置及恢复默认设置,同时说明main(官方稳定)、free(逐渐弃用)、conda-forge(社区更... 目录一、Conda国内镜像源二、Conda临时使用镜像源指定单个源临时指定多个源创建环境时临时指定源

java实现docker镜像上传到harbor仓库的方式

《java实现docker镜像上传到harbor仓库的方式》:本文主要介绍java实现docker镜像上传到harbor仓库的方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 前 言2. 编写工具类2.1 引入依赖包2.2 使用当前服务器的docker环境推送镜像2.2

springboot项目打jar制作成镜像并指定配置文件位置方式

《springboot项目打jar制作成镜像并指定配置文件位置方式》:本文主要介绍springboot项目打jar制作成镜像并指定配置文件位置方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录一、上传jar到服务器二、编写dockerfile三、新建对应配置文件所存放的数据卷目录四、将配置文