腾讯的一笔画游戏



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

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

端点 包含:

  1. 起点

  2. 终点

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

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

比如在一个边长为 100k=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;
}

     
     
    
    


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值