【牛客编程巅峰赛S1第8场】翻滚吧牛牛(一)
翻滚吧牛牛(一)
https://ac.nowcoder.com/acm/problem/208194
题目
牛牛有一个边长为 1 的正六边形,只要牛牛一推它就可以一直滚下去,正六边形左下角为 A。
如图是正六边形翻滚一次的情况。给定正六边形翻滚次数 k,求 A 点翻滚轨迹长度。
解题思路
第 1 次翻滚的轨迹长度为 ,其中 。
第 2 次翻滚的轨迹长度为 ,其中 。
第 3 次翻滚的轨迹长度为 ,其中 。
第 4 次翻滚的轨迹长度为 ,其中 。
第 5 次翻滚的轨迹长度为 ,其中 。
第 6 次翻滚的轨迹长度为 0,因为此时的滚动是以 A 点为圆心的。翻滚完成后,A 点位于六边形左下角。
先计算六边形翻滚的完整的周期(即点 A 从六边形左下角翻滚至六边形左下角)次数 n。
再计算剩余的翻滚次数的轨迹长度。
C++代码
class Solution { public: /** * * @param k int整型 翻滚次数 * @return double浮点型 */ double circumference(int k) { // write code here double pi = acos(-1); int n = k / 6; k %= 6; double r2 = sqrt(3.0); double ans = pi*(4+2*r2)/3*n; if(k==1) ans += pi/3; else if(k==2) ans += pi*(1+r2)/3; else if(k==3) ans += pi*(3+r2)/3; else if(k==4) ans += pi*(3+2*r2)/3; else if(k==5) ans += pi*(4+2*r2)/3; return ans; } };