magic魔术师分身问题

魔法师Silly Hook正在表演一个神奇的魔术,他变出了他自己的N个分身,并成正N边形分布,他本身处于这个正N边形的中心,正N边形的边长为A。然后,每个分身都会朝顺时针方向下一个分身以一个相同的固定的速度V移动,移动方向会随着下一个分身的位置变化而变化,最终所有分身都将到达正N边形的中心,也就是回到Silly Hook本身,表演结束。

Silly Hook计划在比利时埃诺省Silly市巡回演出,他想提前知道对于每次表演需要多少时间。

输入格式:

多组数据,到EOF结束。
每组数据一行三个整数N,A,V,分别表示 每次表演的分身个数,分身分布的正N边形的边长,每个分身移动的速度。

N ≤ 300 , A ≤ 400000 , V ≤ 10000 , 答案 ≤ 10000000 , 数据组数 ≤ 10

输出格式:

 每组数据一个实数,表示最后一个分身到达本身的时间,保留小数点后5位。

样例输入

3 10 5
4 20 8

样例输出

1.33333
2.50000

(PS:本来觉得叙述有点复杂,不想整理。今天丁哥又和我讨论起这个问题,所以这才想把思路写下来—嗯 i am lazy.)

把N个分身看成N个点,抽象成正N边形。每个点的运动包括速度和方向。因为速度不变,而方向是随着顺时针上下一个分身的运动,也会改变。这会引导我们把问题想象成一个辐射曲线问题。所以问题就在这时抽象化了。

————————华丽丽的分割线————————————

所以你应该猜到我要把它变成直线问题。

我们假设一个很小的时间范围t,在这个t内,点是沿着原来正N边形的边运动的,超过这个t,边的运动方向才会改变。量变而后质变,总会存在这样一个t。上图:

《magic魔术师分身问题》

(此图大家只需看两个新旧边体会t即可)

下一步我们即要考虑如何得到在t时刻移动之后两点之间的距离,为算法的核心部分

我们以任意的两点建立直角坐标系,如图:

《magic魔术师分身问题》

我们要做的就是测得两个新点距离和原来的两个点之间距离有什么关系,我在图上简单用描绿的点表示新点,旧点即为AB,我们可以分开计算的新点d(A”B”)=d(AB)-d(A)+d(B),其中d(A)就是A移动的距离=V*t;而d(B)可以用cos求出。

另外一个重点是,因为正N边形运动辐散对称,从而始终保持cos的角度不变,且V(速度)固定,从而在下一个t时间内,也将是这样的运动过程。

直至d=0,AB重合,此刻所有点重合。

D=D-Va*t-Vb*cos*t

所以D=t*(v+v*cos)

————————用题目给出的样例带入检验——-正确————上图————–

《magic魔术师分身问题》

—————–附代码—————–

#include<cstdio>  
#include<iostream>  
#include<cmath>  
using namespace std;  
#define pi acos(-1)  
  
double n,a,v;  
  
int main()  
{  
    while(scanf("%lf%lf%lf",&n,&a,&v)!=EOF) printf("%.5f\n",a/(v+v*cos(pi*(n-2)/n)));  
    return 0;  
}  

=====文笔有限,如有不懂可留言。另感谢丁哥还一直记着这题 – 。=


    原文作者:魔术师发牌问题
    原文地址: https://blog.csdn.net/MoQiJie_ZKy/article/details/79319115
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞