腾讯的一笔画游戏



腾讯开发了一款益智游戏:一笔画。在一个正 nnn 边形上,将 nnn 条边的中点连结,形成一个新的正 nnn 边形,之后再在新的正 nnn 边形内连结各个中点,如此重复 kkk 次,作为游戏的初始图案。

玩家要从初始图案最外层 nnn 个顶点中的一个出发,进行无公共 端点 的一笔画。

端点 包含:

  1. 起点

  2. 终点

  3. 一笔画中方向发生改变的顶点。

画出的长度即为最后的得分,求玩家在给定的图形上最多能得多少分。

比如在一个边长为 100k=1 的正方形图案上进行一笔画,最优的方案如下:

腾讯的一笔画游戏_第1张图片

输入格式

输入第一行有 2 个用一个空格分隔的整数 n(3≤n≤100) k(0≤k≤20)n 为边数,k为重复次数。

输入第二行有一个浮点数 L(0,表示最外层正 n 边形的边长。

输出格式

输出一行,表示最多能得多少分。结果误差在 10^(-3) 以内均被认为是正确的。

样例输入1

4 0
100

样例输出1

300

样例输入2

4 1
100

样例输出2

562.1320343

题意:如题。

题目链接:腾讯的一笔画游戏

解题思路:图形已经将解法写得很清楚了,最优解就是所有n边形的总周长,减去一条边的边长的一半(内部有多边形),或者减去一条边的长度(内部已经没有多边形)。

代码:

//腾讯的一笔画游戏
//链接:http://nanti.jisuanke.com/t/11153

#include
#include

using namespace std;
double PI = acos(-1);   //π的值
int main()
{
    int n,k;
    double l,sum,s;
    while(~scanf("%d%d%lf",&n,&k,&l)){
        sum=l*(n-1);
        s=(n-2)*PI/n;    //正n边形的一个角的角度
        while(k--){
            sum += l/2,l/=2;               //当内部有多边形时,会先加上原来多边形边长的一半,才是最优
            l =sqrt( (1-cos(s)) * 2*l*l ); //余弦定理求内层多边形的边长
            sum += (n-1) * l;              //内层多边形的周长,也只能加上(n-1)条边
        }
        printf("%.7f\n",sum);
    }
    return 0;
}


你可能感兴趣的:(计蒜客计蒜之道,BASE-几何问题,BASE-水题)