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

相关文章

Java计算经纬度距离的示例代码

《Java计算经纬度距离的示例代码》在Java中计算两个经纬度之间的距离,可以使用多种方法(代码示例均返回米为单位),文中整理了常用的5种方法,感兴趣的小伙伴可以了解一下... 目录1. Haversine公式(中等精度,推荐通用场景)2. 球面余弦定理(简单但精度较低)3. Vincenty公式(高精度,

Docker安装MySQL镜像的详细步骤(适合新手小白)

《Docker安装MySQL镜像的详细步骤(适合新手小白)》本文详细介绍了如何在Ubuntu环境下使用Docker安装MySQL5.7版本,包括从官网拉取镜像、配置MySQL容器、设置权限及内网部署,... 目录前言安装1.访问docker镜像仓库官网2.找到对应的版本,复制右侧的命令即可3.查看镜像4.启

Gradle在国内配置镜像加速的实现步骤

《Gradle在国内配置镜像加速的实现步骤》在国内使用Gradle构建项目时,最大的痛点就是依赖下载贼慢,甚至卡死,下面教你如何配置国内镜像加速Gradle下载依赖,主要是通过改写repositori... 目录引言一、修改 build.gradle 或 settings.gradle 的 reposito

windows和Linux使用命令行计算文件的MD5值

《windows和Linux使用命令行计算文件的MD5值》在Windows和Linux系统中,您可以使用命令行(终端或命令提示符)来计算文件的MD5值,文章介绍了在Windows和Linux/macO... 目录在Windows上:在linux或MACOS上:总结在Windows上:可以使用certuti

使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)

《使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)》PPT是一种高效的信息展示工具,广泛应用于教育、商务和设计等多个领域,PPT文档中常常包含丰富的图片内容,这些图片不仅提升了... 目录一、引言二、环境与工具三、python 提取PPT背景图片3.1 提取幻灯片背景图片3.2 提取

Android Studio 配置国内镜像源的实现步骤

《AndroidStudio配置国内镜像源的实现步骤》本文主要介绍了AndroidStudio配置国内镜像源的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、修改 hosts,解决 SDK 下载失败的问题二、修改 gradle 地址,解决 gradle

Docker镜像修改hosts及dockerfile修改hosts文件的实现方式

《Docker镜像修改hosts及dockerfile修改hosts文件的实现方式》:本文主要介绍Docker镜像修改hosts及dockerfile修改hosts文件的实现方式,具有很好的参考价... 目录docker镜像修改hosts及dockerfile修改hosts文件准备 dockerfile 文

Docker镜像pull失败两种解决办法小结

《Docker镜像pull失败两种解决办法小结》有时候我们在拉取Docker镜像的过程中会遇到一些问题,:本文主要介绍Docker镜像pull失败两种解决办法的相关资料,文中通过代码介绍的非常详细... 目录docker 镜像 pull 失败解决办法1DrQwWCocker 镜像 pull 失败解决方法2总

使用国内镜像源优化pip install下载的方法步骤

《使用国内镜像源优化pipinstall下载的方法步骤》在Python开发中,pip是一个不可或缺的工具,用于安装和管理Python包,然而,由于默认的PyPI服务器位于国外,国内用户在安装依赖时可... 目录引言1. 为什么需要国内镜像源?2. 常用的国内镜像源3. 临时使用国内镜像源4. 永久配置国内镜

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何