2020牛客寒假算法基础集训营5 J 牛牛战队的秀场
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;
}
本文来自博客园,作者:correct,转载请注明原文链接:https://www.cnblogs.com/correct/p/12861945.html

                
            
        
浙公网安备 33010602011771号