腾讯开发了一款益智游戏:一笔画。在一个正 nnn 边形上,将 nnn 条边的中点连结,形成一个新的正 nnn 边形,之后再在新的正 nnn 边形内连结各个中点,如此重复 kkk 次,作为游戏的初始图案。
玩家要从初始图案最外层 nnn 个顶点中的一个出发,进行无公共 端点 的一笔画。
端点 包含:
-
起点
-
终点
-
一笔画中方向发生改变的顶点。
画出的长度即为最后的得分,求玩家在给定的图形上最多能得多少分。
比如在一个边长为 100、k=1 的正方形图案上进行一笔画,最优的方案如下:
输入格式
输入第一行有 2 个用一个空格分隔的整数 n(3≤n≤100) 和 k(0≤k≤20),n 为边数,k为重复次数。
输入第二行有一个浮点数 L(0<L≤10^3),表示最外层正 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;
}