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

题目传送门


题目描述

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

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

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

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

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


输入描述:

输入数据共22行,第一行有两个整数 n , r ( 3 n 1000 , 1 r 1 0 6 ) n,r(3 \leq n \leq 1000, 1 \leq r \leq 10^6) ,表示在半径为r的圆上画了一个内接nn边形。

第二行有两个整数 i , j ( 1 i , j n ) i, j(1 \leq i, j \leq n) ,表示牛牛一开始在i号顶点,牛能一开始在j号顶点。


输出描述:

一个小数x,表示牛牛要移动的最短距离。

如果你的答案是a,标准答案是b,如果 a b m a x ( 1 , b ) 1 0 6 \frac{|a-b|}{max(1,|b|)}\leq 10^{-6} ,你的答案将被判定为正确。


输入

4 1
1 2


输出

1.414214


题解

  • 先求一条边的边长。如图, n n 边形对应的 θ = 2 π 2 n = π n \theta=\frac{2 \pi}{2 n}=\frac{\pi}{n} ,边长就是 2 r sin θ = 2 r sin π n 2 r \sin \theta=2 r \sin \frac{\pi}{n}

  • 再求i到j最短经过几条边: l = ( i j ) m o d n l=(i-j) \bmod n

  • 最后答案就是 2 r sin π n ( i j ) m o d n 2 r \sin \frac{\pi}{n} \cdot(i-j) \bmod n
    在这里插入图片描述


AC-Code

#include <bits/stdc++.h>
using namespace std;
#define PI acos(-1)
int main() {
    int n, r;    while (cin >> n >> r) {
        double ans = 0;
        int i, j;    cin >> i >> j;
        if (i > j) swap(i, j);
        int dt = min(i + n - j, j - i);
        printf("%.6f\n", dt * 2.0 * r * sin(PI / n));
    }
    return 0;
}
发布了184 篇原创文章 · 获赞 112 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Q_1849805767/article/details/104305358