题目链接

传送门

题意

告诉你圆锥的底部圆的半径和圆锥的高,再给你一个点的坐标及其运动向量,问你这个点什么时候会与这个圆锥相撞。

思路

比赛场上二分一直没过但是有人二分过了,今天再写这题想再试下二分,最后发现了自己的问题所在(可能这个点在\(check\)的时候已经穿过圆锥但是我的代码会把它当成还没达到,所以就会使得\(lb=mid\))。最后按照公式求解过了。

圆锥表面方程为

\[\begin{aligned}
\begin{cases}
\frac{h-z}{h}=\frac{R}{r}\\
x^2+y^2= R
\end{cases}
\end{aligned}
\]

然后设相撞时间为\(t\),则点的坐标变成

\[x=x_0+v_xt\\
y=y_0+v_yt\\
z=z_0+v_zt
\]

然后联立化简得到

\[(v_x^2+v_y^2-\frac{r^2v_z^2}{h^2})t^2+2(v_xx_0+v_yy_0-\frac{z_0v_zr^2}{h^2}+\frac{v_zr^2}{h})t+x_0^2+y_0^2-\frac{r^2}{h^2}(h-z_0)^2=0
\]

求得

\[t_1=\frac{-b+\sqrt{b^2-4ac}}{2a}\\
t_2=\frac{-b-\sqrt{b^2-4ac}}{2a}
\]

最后再\(check\)是否恰好相撞取最小值即可。

代码实现如下

#include <set>
#include <map>
#include <deque>
#include <queue>
#include <stack>
#include <cmath>
#include <ctime>
#include <bitset>
#include <cstdio>
#include <string>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <unordered_map>
using namespace std; typedef long long LL;
typedef pair<LL, LL> pLL;
typedef pair<LL, int> pLi;
typedef pair<int, LL> pil;;
typedef pair<int, int> pii;
typedef unsigned long long uLL; #define lson rt<<1
#define rson rt<<1|1
#define lowbit(x) x&(-x)
#define name2str(name) (#name)
#define bug printf("*********\n")
#define debug(x) cout<<#x"=["<<x<<"]" <<endl
#define FIN freopen("D://Code//in.txt","r",stdin)
#define IO ios::sync_with_stdio(false),cin.tie(0) const double eps = 1e-8;
const int mod = 998244353;
const int maxn = 5000 + 7;
const double pi = acos(-1);
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3fLL; int t;
double r, h, vx, vy, vz, x, y, z; bool check(double t) {
double xx = x + vx * t;
double yy = y + vy * t;
double zz = z + vz * t;
if(zz < 0) return false;
if(zz > h) return false;
double R = (h - zz) * r / h;
return (sqrt(xx * xx + yy * yy) - R) <= eps;
} int main() {
scanf("%d", &t);
int icase = 0;
while(t--) {
scanf("%lf%lf%lf%lf%lf%lf%lf%lf", &r, &h, &x, &y, &z, &vx, &vy, &vz);
if(z < 0 && sqrt(x * x + y * y) <= r * r) {
printf("Case %d: %.7f\n", ++icase, abs(z) / abs(vz));
continue;
}
double a = vx * vx + vy * vy - r * r * vz * vz / h / h;
double b = 2 * (vx * x + vy * y - z * vz * r * r / h / h + h * vz * r * r / h / h);
double c = x * x + y * y - r * r / h / h * (h - z) * (h - z);
double ans1 = (-b + sqrt(b * b - 4 * a * c)) / (2 * a);
double ans2 = (-b - sqrt(b * b - 4 * a * c)) / (2 * a);
double ans = INF;
if(check(ans1)) ans = min(ans, ans1);
if(check(ans2)) ans = min(ans, ans2);
printf("Case %d: %.7f\n", ++icase, ans);
}
return 0;
}

The Tower(HDU6559+2018年吉林站+数学)的更多相关文章

  1. 2018 CCPC 吉林站 H Lovers

    2018 CCPC 吉林站 H Lovers 传送门:https://www.spoj.com/problems/LIS2/en/ 题意: q次操作 1.将第l~r个数的左边和和右边都加上一个数d, ...

  2. Justice(HDU6557+2018年吉林站+二进制)

    题目链接 传送门 题意 给你\(n\)个数,每个数表示\(\frac{1}{2^{a_i}}\),要你把这\(n\)个数分为两堆,使得每堆的和都大于等于\(\frac{1}{2}\). 思路 首先我们 ...

  3. Strength(HDU6563+2018年吉林站+双指针瞎搞)

    题目链接 传送门 题意 你有\(n\)只怪,每只怪的伤害为\(a_i\),对手有\(m\)只怪,每只怪的伤害为\(b_i\),对手的怪有普通状态和防守状态(普通状态:如果你用攻击力为\(a_i(a_i ...

  4. Lovers(HDU6562+线段树+2018年吉林站)

    题目链接 传送门 题意 初始时有\(n\)个空串,然后进行\(q\)次操作,操作分为以下两种: wrap l r x:把\(l,r\)中的每个字符串的首尾都加入\(x\),如\(s_i=121,x=3 ...

  5. 2018 CCPC 吉林站 H Lovers || HDU 6562 (线段树哦)

    http://acm.hdu.edu.cn/showproblem.php?pid=6562 题意: q次操作 1.将第l~r个数的左边和和右边都加上一个数d, 使得这个数变成 dsiddsid的形式 ...

  6. 2018年9月22日CCPC吉林站参赛总结

    发现思维题是硬伤,代码能力是硬伤,对知识点的理解不深刻是硬伤 接下来要做的就是 1.熟悉每一个知识点,把每一个知识点和实现它的代码联系在一起学习 2.多见题,看看他们是怎么考察这些知识点的,等比赛的时 ...

  7. 2018年中国研究生数学建模竞赛C题 二等奖 赛题论文

    2018年中国研究生数学建模竞赛C题 对恐怖袭击事件记录数据的量化分析 恐怖袭击是指极端分子或组织人为制造的.针对但不仅限于平民及民用设施的.不符合国际道义的攻击行为,它不仅具有极大的杀伤性与破坏力, ...

  8. 2018 CCPC 桂林站(upc复现赛)补题

    2018 CCPC 桂林站(upc复现赛)补题 G.Greatest Common Divisor(思维) 求相邻数的差值的gcd,对gcd分解素因子,对所有的素因子做一次遍历,找出最小答案. 几个样 ...

  9. 2018 ccpc吉林 The Tower

    传送门:HDU - 6559 题意 在一个三维空间,给定一个点和他的三维速度,给定一个圆锥,问这个点最早什么时候能撞上圆锥. 题解 本来一直想着怎么求圆锥的方程,然后....队友:这不是二分吗!然后问 ...

随机推荐

  1. vue做页面按钮权限--分析

    import * as types from '../mutation-types' const state = { btnCode: getBtnCode(), } const mutations ...

  2. Django框架深入了解_01(Django请求生命周期、开发模式、cbv源码分析、restful规范、跨域、drf的安装及源码初识)

    一.Django请求生命周期: 前端发出请求到后端,通过Django处理.响应返回给前端相关结果的过程 先进入实现了wsgi协议的web服务器--->进入django中间件--->路由f分 ...

  3. canal使用

    报错信息:com.alibaba.druid.pool.DruidDataSource - testWhileIdle is true, validationQuery not set 解决方法: 找 ...

  4. Idea 目录结构下有红色波浪线

    问题截图: 解决方案: Build -> Rebuild Project

  5. ubuntu查看软件安装位置

    ubuntu中的软件可通过图形界面的软件中心安装,也可以通过命令行apt-get install安装.但是安装后的软件在哪个位置呢?这点跟windows环境下安装软件的路径选择不一样.ubuntu中可 ...

  6. 生意bisynes商业

    1.Of, to, pertaining to or utilized for purposes of conducting trade, commerce, governance, advocacy ...

  7. Docker容器挂载文件(转载)

    一.Docker pull 安装 Nginx 1.查看docker仓库中的 nginx 命令 # 使用 docker search 命令搜索存放在 Docker Hub 中的镜像 docker sea ...

  8. golang ---cron

    package main import ( l4g "github.com/alecthomas/log4go" "github.com/robfig/cron" ...

  9. 阿里巴巴 Java 开发手册 (七) 控制语句

    1. [强制]在一个 switch 块内,每个 case 要么通过 break/return 等来终止,要么注释说明程 序将继续执行到哪一个 case 为止:在一个 switch 块内,都必须包含一个 ...

  10. C# vb .net实现轮廓特效滤镜

    在.net中,如何简单快捷地实现Photoshop滤镜组中的轮廓特效呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第一步 ...