题目:点击打开链接
题意:给定一个面积值,要求在单元网格上面能围成大于等于该面积值的最短周长所需多少步。围成的周长所用的边(也就是每一步的走法)只能沿着单元格的四条边或是单元格的对角线。
思路:题目要求大概可概括为给定面积求步数,我们反过来推算给定一个步数,或者说每让你走一步,可以围成最大多大的面积。前几个可能会看不出规律,多推几个,可发现一个周期 4,网格上的图形是个矩形,四边通过依次增加步数而扩大的面积(半个单元格的个数)有着一定的规律,在一个周期内半个单元格个数是相等的,每到下一个周期该个数增加 2 个。把步数对应的最大面积(double型)存到数组,之后每个样例读进来直接lower_bound函数找位置即可。详细看代码。
代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int cnt,k,T,S;
double a[100002];
a[4]=2;
a[5]=2.5;
k=3;
for(int i=6;;i++)
{
a[i]=a[i-1]+k*0.5;
if(a[i]>=1e9)
{
cnt=i;
break;
}
if(i%4==0)
k+=2;
}
scanf("%d",&T);
while(T--)
{
scanf("%d",&S);
int ans=lower_bound(a,a+cnt,S)-a;
printf("%d\n",ans);
}
return 0;
}