主要以对角线绘画图形面积最大。且所画图形最好接近正方形。先打表存下1*1, 1*2, 2*2, 2*3, 3*3的面积,随后对所求面积与打表内容进行对比。如果与表不相同,如何选择最优边数呢,我们可以发现,一条斜边可以拆成两条直边。也就是多了一条边,多一条边可以满足的最大面积为在原来面积上多出一个梯形,如果这么大面积还不够满足,那我们只能再多加一条边,多两条边的情况下,3*4 之类的就可以直接画成4*4了,此时,该边数面积最大
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define maxn 100000
LL ans;int t;
int n;
LL sq[2*maxn+10];
int laz=0;
void get()
{
sq[0]=0;
for(int i =1; i< maxn; i++)
{
sq[laz++] = i*i*2;
sq[laz++] = i*(i+1)*2;
}
}
int main()
{
get();
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);int i;
if(n==1)
{
puts("4");
continue;
}
if(n==2)
{
puts("4");
continue;
}
for(i = 1; i <= laz; i++ )
{
if(n<sq[i])
{
break;
}
}
i--;
LL bian = sqrt((double)(sq[i]/2));
bool flag=0;
if(bian*bian == sq[i]/2)
flag = 1;
LL xx;
if(flag) xx = bian*4;
else xx = bian*4+2;
if(n == sq[i])
{
printf("%d\n",xx);
continue;
}
int res = n - sq[i];
if(!flag)
bian++;
double mianji = (bian+bian-1.0)/2;
if(res<=mianji) printf("%d\n", xx+1);
else printf("%d\n", xx+2);
}
}