思路:这道题其实不难,难点在于弄懂题意和需要有发散性思维。在比赛的时候我一直不知道要怎么去画,题意没理解清楚,以为用单位正方形去填。
这道题其实是给你一个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);
}
}