#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
const int maxn=1e6+5;
/*
递推+网格
题意:在笛卡尔坐标系下,画一个面积至少为n的简单多边形,
每次只能画一条边或者一个格子的对角线,问至少要画几条。
规律:
笔画 4 5 6 7 8 9 10 11 12 13 14 15 16
面积 2 2.5 4 5.5 8 9.5 12 14.5 18 20.5 24 27.5 32
*/
double a[maxn];
int n;
void init()
{
a[4]=2;
a[5]=2.5;
a[6]=4;
double u=4;//初始化差值
double v=1.5;
for(int i=7;i<=maxn;i++)
{
int k=i%4;
if(k==1)//增加的面积比前一次多1
{
a[i]=a[i-1]+v;
v+=1.0;
}
if(k==2)//增加的面积比前一次多2
{
a[i]=a[i-2]+u;
u+=2;
}
if(k==3)//增加的面积和前面一次相同
{
a[i]=a[i-1]+v;
}
if(k==0)//增加的面积和前面一次相同
{
a[i]=a[i-2]+u;
}
}
}
int main()
{
int t;
init();
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
int ans=lower_bound(a,a+maxn,n)-a;
printf("%d\n",ans);
}
return 0;
}
HDU6154 CaoHaha's staff(递推+网格)
最新推荐文章于 2017-08-22 21:50:24 发布