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

相关文章

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 参数?二、国内镜像源的选择三、如何

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

docker如何删除悬空镜像

《docker如何删除悬空镜像》文章介绍了如何使用Docker命令删除悬空镜像,以提高服务器空间利用率,通过使用dockerimage命令结合filter和awk工具,可以过滤出没有Tag的镜像,并将... 目录docChina编程ker删除悬空镜像前言悬空镜像docker官方提供的方式自定义方式总结docker

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c