https://ac.nowcoder.com/acm/contest/3006/J
题目描述
牛牛战队里,不仅有训练,也有追逐。
牛牛和牛能总是想知道谁更秀一点,他们通常会去比谁的代码更秀,谁的成绩更秀……
这一次,他们开始比谁的走位更秀。他们来到一个半径为 的圆上,画了圆内接的正 边形。为了秀走位,他们只允许自己在多边形的边上移动。
同时,他们随便选取正 边形的一个顶点为1号顶点,按顺时针的顺序把其他的点叫做2号顶点,3号顶点……一开始,两人分别在 号顶点和 号顶点。
现在,牛牛要一边沿着多边形的边秀走位,一边走向牛能。他想知道,他最短要走多少距离才能走到牛能的旁边?
思路
简单的计算几何,既然是正 边形,那么内角和一共是,里面一共有 个角,每个角就是,然后过圆心任意一条边的垂线(三线合一),连接成一个直角三角形,易知其中有一个角是,有了圆的半径相当于有了直角三角形的斜边,可以求得正多边形的边长是,两个人位置的点分别是 和 , 多边形一共有 条边, 通向 有两种走法分别需要通过 和 条边,二者求一个最小值,乘以边长即可,注意精度。
/*************************************************************************
> File Name: J.cpp
> Author: amoscykl
> Mail: amoscykl@163.com
> Created Time: 2020年02月13日 星期四 13时57分44秒
************************************************************************/
#include<bits/stdc++.h>
using namespace std;
const double pi = acos(-1);
int n, r;
int main()
{
scanf("%d %d", &n, &r);
double x = 2.0 * r;
x *= cos(((n - 2 * 1.0) / (n * 2.0) * pi));
int i, j;
scanf("%d %d", &i, &j);
int mn = abs(i - j);
mn = min(mn, n - mn);
printf("%.7lf\n", mn * 1.0 * x);
return 0;
}