hdu6154 CaoHaha's staff 找规律

点击打开hdu6154

思路:这道题其实不难,难点在于弄懂题意和需要有发散性思维。在比赛的时候我一直不知道要怎么去画,题意没理解清楚,以为用单位正方形去填。

这道题其实是给你一个n,代表一个面积,你需要用最少的步骤围出一块不小于n的面积,而你每次用来围的隔板长度为2或者sqrt(2),而且最后必须封闭。其实n为1~7都是可以当作特例处理,当n大于8时才开始出现规律,每次增加一条边面积增加的有规律。下买面用面积为8来举例子,为了使面积最大,隔板最少,所以,尽量使用sqrt(2).当面积为8时可以使用8条sqrt(2)的边围成一个正方形,每条边的长度为2*sqrt(2),然后当你增加一条斜边时,原来的两条边接到这条斜边两端(见图),然后在增加一条边时,可以想象右边出现类似左边的图形,然后可以把

左右两边的梯形上部腰拉长接在一起(见图),第三次加时一样,只不过拉长地点在左边的顶点(见图),最后第四次走完一圈,变成最后的图。

图的话,看实线就好,画的比较烂。

根据上面面积为八的例子,我们可以推广,每次对于一个n,先确定比他小的最小正方形是那个,然后就可以走一遍,发现答案。所以要先对n/2因为边由sqrt(2)的倍数组成,

然后开平方,往下取整,因为是正方形求面积。m=floor(sqrt(n/2));

当增加一条斜边的时候面积增加a= (2*m-1)*0.5

·斜边+2    面积增加  b=a*2+1;

斜边+3   面积增加  c=1+a+b;

斜边 +4   面积增加  d=2+a+c;至于为什么,先在纸上画一个单元格的背景,在这些单元格的基础上去画我的图,直接看图就发现,我这里为了突出形状所以没画单元格。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        double n;
        scanf("%lf",&n);
        if(n==0) {cout<<0<<endl;continue;}
        else if(n==1) {cout<<4<<endl;continue;}
        else if(n==2) {cout<<4<<endl;continue;}
        else if(n==3) {cout<<6<<endl;continue;}
        else if(n==4) {cout<<6<<endl;continue;}
        else if(n==5) {cout<<7<<endl;continue;}
        else if(n==6) {cout<<8<<endl;continue;}
        else if(n==7) {cout<<8<<endl;continue;}
        double m=floor(sqrt(n*1.0/2));///满足小于n的正方形的最小边长由几条斜边组成
       // cout<<m<<endl;
        double temp=m*4,s=m*m*2;///temp正方形所需斜边数,s正方形面积相当于(m*sqrt(2)*m*sqrt(2))
        double a,b,c,d;
        a=(2*m-1)*0.5;
        b=a*2+1;
        c=b+1+a;
        d=2+a+c;
        //while(s)
        if(n==s) printf("%.0lf\n",temp);
        else if(n>s&&n<=(s+a)) printf("%.0lf\n",temp+1);
        else if(n>a&&n<=(s+b)) printf("%.0lf\n",temp+2);
        else if(n>b&&n<=(s+c))printf("%.0lf\n",temp+3);
        else if(n>c&&n<=(s+d)) printf("%.0lf\n",temp+4);
    }
}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值