2020牛客寒假算法基础集训营5 J 牛牛战队的秀场

https://ac.nowcoder.com/acm/contest/3006/J

题目描述

牛牛战队里,不仅有训练,也有追逐。

牛牛和牛能总是想知道谁更秀一点,他们通常会去比谁的代码更秀,谁的成绩更秀……

这一次,他们开始比谁的走位更秀。他们来到一个半径为 r 的圆上,画了圆内接的正 n 边形。为了秀走位,他们只允许自己在多边形的边上移动。

同时,他们随便选取正 n 边形的一个顶点为1号顶点,按顺时针的顺序把其他的点叫做2号顶点,3号顶点……一开始,两人分别在 i 号顶点和 j 号顶点。

现在,牛牛要一边沿着多边形的边秀走位,一边走向牛能。他想知道,他最短要走多少距离才能走到牛能的旁边?

思路

简单的计算几何,既然是正 n 边形,那么内角和一共是(n-2)\pi,里面一共有 n 个角,每个角就是\frac{(n-2)\pi}{n},然后过圆心任意一条边的垂线(三线合一),连接成一个直角三角形,易知其中有一个角是\frac{(n-2)\pi}{2n},有了圆的半径相当于有了直角三角形的斜边,可以求得正多边形的边长是2r\cos\frac{(n-2)\pi}{2n},两个人位置的点分别是 i 和 j ,n 多边形一共有 n 条边,i 通向 j 有两种走法分别需要通过 \left | i-j \right | 和 n-\left | i-j \right | 条边,二者求一个最小值,乘以边长即可,注意精度。

/*************************************************************************
    > File Name: J.cpp
    > Author: amoscykl
    > Mail: [email protected]
    > 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;
}
发布了204 篇原创文章 · 获赞 13 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43701790/article/details/104308386