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: 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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值