首页 > 试题广场 >

翻滚六边形

[编程题]翻滚六边形
  • 热度指数:370 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
有一个边长为1的正六边形,只要 一推它就可以一直滚下去,正六边形左下角为A,想知道正六边形翻滚k次A点的轨迹边长是多少呢。如图是正六边形翻滚一次的情况。给定正六边形翻滚次数k,求A点翻滚轨迹长度


示例1

输入

3

输出

4.955392

备注:
,返回值与答案误差应小于0.00001
可以画图观察一下,翻滚第一次的时候是以1为半径转动60°,翻滚第二次的时候是以根号3为半径转动60°,翻滚第三次的时候是以2为半径转动60°,第四次与第二次相同,第五次与第一次相同,第六次转动时是以A点为圆心,所以这次没有产生轨迹,之后再翻滚也是重复这个模式,以6次翻滚为一个周期。
根据弧长公式可以初始化一个前六次翻滚的轨迹累积弧长数组,然后根据翻滚次数与6的关系计算总轨迹长度。
import java.util.*;


public class Solution {
    /**
     * 
     * @param k int整型 翻滚次数
     * @return double浮点型
     */
    public double circumference (int k) {
        // write code here
        double[] calSum = new double[]{Math.PI / 3, 
                                       Math.PI / 3 + Math.PI / Math.sqrt(3), 
                                       Math.PI + Math.PI / Math.sqrt(3), 
                                       Math.PI + 2 * Math.PI / Math.sqrt(3), 
                                       Math.PI + 2 * Math.PI / Math.sqrt(3) + Math.PI / 3,
                                       Math.PI + 2 * Math.PI / Math.sqrt(3) + Math.PI / 3};
        return k / 6 * (Math.PI / 3 *(2*Math.sqrt(3) + 4)) + (k % 6 != 0? calSum[k % 6 - 1]: 0);
    }
}

发表于 2021-05-22 19:33:28 回复(0)
【牛客编程巅峰赛S1第8场】翻滚吧牛牛(一) 写得挺好了
这里简化一下代码,利用余弦定理。
运行时间:29ms 占用内存:6536KB 使用语言:Python 3 用例通过率:100.00%
import math
#
#
# @param k int整型 翻滚次数
# @return double浮点型
#
class Solution:
    def circumference(self, k):
        # write code here
        s = 0
        for i in range(1, k+1):
            s += math.sqrt(2-2*math.cos(math.pi/3*i))*math.pi/3
        return s


发表于 2020-10-07 12:47:29 回复(0)

问题信息

难度:
2条回答 1503浏览

热门推荐

通过挑战的用户

查看代码